Integer缓存机制由IntegerCache实现,默认范围-128~127(JLS强制要求),valueOf()和自动装箱复用缓存对象,new构造器绕过缓存;可通过-XX:AutoBoxCacheMax=N扩大上限,仅Integer支持,下限固定不可调。

Java 中 Integer 的缓存机制由 IntegerCache 类实现,默认缓存范围是 -128 到 127(含两端)。这个范围内的整数值调用 Integer.valueOf(int) 时会复用缓存对象,而非新建实例;超出该范围则每次返回新对象。
默认缓存范围:-128 ~ 127
这是 JVM 规范强制要求的最小缓存区间(JLS §5.1.7),所有符合规范的 JDK 实现都必须支持该范围的缓存。例如:
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,未命中缓存,为两个不同对象
如何扩大缓存范围?通过 JVM 参数
从 JDK 1.6 开始,可通过启动参数 -XX:AutoBoxCacheMax=N 扩大上限(下限固定为 -128,不可调整)。例如:
-
-XX:AutoBoxCacheMax=200:缓存范围变为 -128 ~ 200 - 该参数仅对
Integer有效,Short、Long等不支持类似配置 - 设置值必须为正整数,若小于 127,则仍保持默认上限 127(即取 max(127, N))
- 需在 JVM 启动时指定,运行时无法修改
注意:== 比较仅适用于缓存内值
不要依赖 == 判断两个 Integer 是否“相等”,因为结果取决于是否命中缓存:
立即学习“Java免费学习笔记(深入)”;
- 推荐统一使用
.equals()进行值比较 -
Integer.valueOf()是推荐的创建方式,避免直接用new Integer()(已废弃) - 自动装箱(如
Integer i = 100;)底层也调用valueOf(),同样受缓存影响
其他包装类的缓存情况
除 Integer 外,其余基本类型包装类的缓存规则如下:
-
Boolean:仅缓存true和false -
Byte、Short、Character('\u0000'~'\u007f' 即 0~127):固定缓存全部可能值,不可配置 -
Long:JDK 9+ 支持-XX:AutoBoxCacheMax,但默认不启用缓存(即无默认范围),需显式设置才生效;JDK 8 及之前不支持该参数
不复杂但容易忽略:缓存行为只作用于 valueOf() 和自动装箱,与构造器无关;自定义范围仅影响 Integer,且必须靠启动参数,代码中无法动态修改 IntegerCache。


















