应使用 Integer.valueOf() 替代 new Integer(),因前者复用缓存中 -128 至 127 的实例,提升性能与内存效率;超出范围仍更可控,且 JDK9 起 new Integer(int) 已弃用。
直接用 integer.valueof() 替代 new integer(),就能立即享受缓存带来的内存与性能提升——核心在于复用已创建的 integer 实例,而不是每次都分配新对象。
理解 Integer 缓存的默认范围
Java 规范强制要求 JVM 缓存 -128 到 127(含)之间的所有整数值。这些对象在类加载时就初始化完毕,存在 IntegerCache.cache[] 数组中。
- 调用
Integer.valueOf(42)或自动装箱Integer i = 42;→ 直接返回缓存中的同一个对象 - 而
new Integer(42)每次都 new 出全新实例,地址不同、不共享、不可复用 - 超出范围如
valueOf(200)虽不命中缓存,仍走静态工厂逻辑,比new更可控,也便于未来优化
避免 == 判断出错,同时节省堆空间
缓存不仅影响性能,还直接影响对象相等性判断和内存占用:
-
Integer a = Integer.valueOf(100); Integer b = Integer.valueOf(100);→a == b为 true -
Integer x = new Integer(100); Integer y = new Integer(100);→x == y为 false(两个独立堆对象) - 高频场景(如循环中装箱)下,
new Integer()会快速堆积大量短命对象,加重 GC 压力
利用 JVM 参数适度扩展缓存上限
默认缓存只到 127,但若业务中常用更大整数(如订单 ID、状态码集中在 0–500),可通过启动参数扩大缓存范围:
- 添加 JVM 参数:
-XX:AutoBoxCacheMax=500 - 系统属性生效时机:在 VM 初始化阶段读取,需在应用启动前配置
- 注意上限不能超过
Integer.MAX_VALUE - (-128),否则数组创建失败
统一使用自动装箱或 valueOf(),彻底规避 new Integer()
JDK 9 起 new Integer(int) 已被标记为 @Deprecated,明确不推荐:
立即学习“Java免费学习笔记(深入)”;
- 日常写
Integer i = 123;编译后自动转为Integer.valueOf(123),天然受益于缓存 - 显式构造时,一律改用
Integer.valueOf(x),哪怕 x 是变量或表达式 - 极少数需要强制新建(如单元测试验证对象唯一性)时,可用
new Integer("123")字符串构造,但几乎无实际必要



















