Integer缓存默认范围是-128到127,下限-128硬编码不可改,上限127可通过-Djava.lang.Integer.IntegerCache.high=200或-XX:AutoBoxCacheMax=200调高,仅影响valueOf和自动装箱,对new Integer无效。

Java 中 IntegerCache 的默认缓存范围是 -128 到 127,这个下限 -128 是硬编码、不可修改的;但上限 127 可以通过 JVM 启动参数调高。
如何用 JVM 参数扩大 Integer 缓存上限
只能调高上限(比如设为 200、500),不能改低限。生效方式是在启动 Java 应用时传入参数:
推荐写法(兼容性好):
-Djava.lang.Integer.IntegerCache.high=200-
等效写法(HotSpot JVM 特有):
-XX:AutoBoxCacheMax=200立即学习“Java免费学习笔记(深入)”;
Java Maven Common下载Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
✅ 两种写法效果一致,JVM 会取其中较大值(若同时设置)。
⚠️ 设置值小于 127 会被自动修正为 127。
哪些场景会受该参数影响
只对以下方式创建的 Integer 对象起作用:
-
Integer.valueOf(180) - 自动装箱:
Integer a = 180;(底层调用的就是valueOf)
不会影响:
-
new Integer(180):永远新建对象,不走缓存 - 其他包装类(如
Long、Short)需各自对应参数(如-XX:AutoBoxCacheMax对Long无效) - 运行时动态修改参数:无效,缓存数组在类加载时就初始化完成
实际使用注意事项
- 参数必须在应用启动前指定,例如:
java -Djava.lang.Integer.IntegerCache.high=500 MyApp
- 修改后,
Integer.valueOf(300) == Integer.valueOf(300)可能返回true(之前是false) - 但
Integer.valueOf(300) == new Integer(300)仍为false,语义没变 - 不同环境(测试/生产)、不同 JDK 版本或参数配置,可能导致
==行为不一致,不建议依赖它做逻辑判断
真正安全的比较方式始终是:
- 比较数值用
.equals() - 或直接用基本类型(如
int)参与运算,让自动拆箱处理
不复杂但容易忽略。

















