java中integer.valueof()对−128到127范围内的整数缓存复用对象以提升性能,该行为由jls强制规定,通过静态不可变的integercache实现;超出此范围或使用new integer()则每次新建对象。

Java 中 Integer.valueOf() 对 −128 到 127 范围内的整数做了缓存,复用已有对象,避免重复创建,从而提升装箱性能。关键在于**主动使用 valueOf() 替代自动装箱或 new Integer()**,并理解缓存边界与 JVM 参数的影响。
为什么这个范围会被缓存?
这是 Java 语言规范(JLS)明确要求的行为:所有值在 [−128, 127] 区间的 Integer 对象,必须由 Integer.valueOf(int) 返回同一个缓存实例(即引用相等)。该缓存由 IntegerCache 类实现,初始化时一次性创建 256 个对象(从 −128 到 127)。
- 缓存是静态的、只读的,启动后不可修改内容
- 超出此范围的值(如 128 或 −129)每次调用
valueOf()都会新建对象 -
new Integer(100)即使在范围内也不会走缓存,而是强制新建对象
如何正确利用缓存提升性能?
核心原则:对已知落在 −128~127 的整数,统一用 Integer.valueOf(int);避免自动装箱(尤其在循环/高频场景),更严禁使用 new Integer()。
- ✅ 推荐写法:
Integer i = Integer.valueOf(42);—— 复用缓存对象 - ⚠️ 自动装箱看似简洁:
Integer j = 42;—— 编译器底层仍调用valueOf(),安全但隐式,适合普通场景 - ❌ 绝对避免:
Integer k = new Integer(42);—— 每次都新建对象,完全绕过缓存 - ? 在集合操作中显式使用:
list.add(Integer.valueOf(x));(当 x 是局部计算结果且确定在范围内)
注意边界与可配置性
默认缓存上限是 127,但可通过 JVM 参数 -Djava.lang.Integer.IntegerCache.high=200 扩大上限(如设为 200,则 −128 到 200 均被缓存)。注意:
- 下限 −128 固定,不可调整
- 参数需在 JVM 启动时设置,运行时无效
- 扩大缓存会增加类加载时内存占用(每个新增整数对应一个新对象)
- 实际项目中除非有强需求(如大量 150 左右的 ID),否则不建议修改,默认值已覆盖绝大多数计数、状态码、小索引等场景
验证缓存是否生效的小技巧
用 == 比较两个相同小整数的包装类引用,若为 true,说明来自同一缓存对象:
Integer a = Integer.valueOf(100); Integer b = Integer.valueOf(100); System.out.println(a == b); // true Integer c = Integer.valueOf(200); Integer d = Integer.valueOf(200); System.out.println(c == d); // false(除非设置了 high 参数且 ≥200)
注意:永远不要依赖 == 比较 Integer 逻辑值,应使用 .equals();此处仅用于调试缓存行为。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











