java包装类中,integer、byte、short、long缓存-128至127,character缓存0至127,boolean缓存true/false,float/double不缓存;valueof()复用缓存对象,new始终新建实例。

Java 中的包装类(如 Integer、Byte、Short、Long、Character)通过 valueOf() 方法创建对象时,会优先复用内部缓存中的实例,从而节省内存并提升性能。这是比直接使用 new 更推荐的方式。
哪些包装类支持缓存?缓存范围是多少?
并非所有包装类都默认启用缓存,且缓存范围有明确限制:
-
Boolean:缓存
true和false两个实例(静态 final) - Byte、Short、Integer、Long:默认缓存 -128 到 127(含)之间的值
- Character:缓存 0 到 127 的字符(即 ASCII 可见字符及控制字符)
-
Float 和 Double:不提供缓存(
valueOf()每次返回新对象)
为什么 valueOf() 能复用对象,而 new 不行?
valueOf() 是静态工厂方法,内部做了缓存判断;而 new 总是分配新内存:
-
Integer.valueOf(100)→ 查缓存表(-128~127),命中,返回已有对象 -
Integer.valueOf(200)→ 超出默认范围,新建Integer实例 -
new Integer(100)→ 总是新建对象,即使值在缓存范围内
因此,用 == 比较时结果可能不同:
Integer a = Integer.valueOf(100); Integer b = Integer.valueOf(100); System.out.println(a == b); // true(复用同一对象) Integer c = new Integer(100); Integer d = new Integer(100); System.out.println(c == d); // false(两个不同对象)
如何扩大 Integer 等类型的缓存范围?
可通过 JVM 参数调整(仅对 Integer 有效,其他类型不可配置):
- 启动时添加:
-Djava.lang.Integer.IntegerCache.high=500 - 该设置将缓存上限从 127 提高到 500(下限固定为 -128)
- 注意:必须在 JVM 启动时设置,运行时无法修改;且只影响后续
valueOf()调用
实际使用建议
日常开发中应始终优先使用 valueOf(),而非构造器:
- 统一写法:
Integer i = Integer.valueOf(42);,而不是new Integer(42)(后者自 Java 9 起已弃用) - 比较包装类数值时,用
.equals()或Objects.equals(),避免因缓存导致的==行为不一致 - 若需确保对象唯一性(如做锁对象),不要依赖缓存,应显式
new或使用其他机制
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











