java包装类缓存机制中,byte、short、integer、long缓存-128~127,character缓存0~127,boolean仅缓存true/false,float/double无缓存;integer缓存上限可通过-xx:autoboxcachemax调整,其余不可配置。

Java 包装类(如 Integer、Byte、Short、Long、Character)在自动装箱(autoboxing)时,对特定范围内的值会复用缓存对象;超出该范围时,则每次创建**全新的对象**,不走缓存。
哪些包装类有缓存?缓存范围是多少?
并非所有包装类都默认启用缓存,且范围各不相同:
-
Byte、Short、Integer、Long:缓存范围是
[-128, 127](可扩展,但默认仅此区间) -
Character:缓存范围是
[0, 127](即 ASCII 可见字符及控制字符) -
Boolean:只缓存
true和false两个实例(无“范围”概念) - Float、Double:没有缓存机制,每次装箱都新建对象
超出缓存范围时,如何创建新对象?
当值超出缓存区间(例如 Integer i = 200;),JVM 不查找缓存,而是直接调用对应包装类的构造方法或静态工厂方法(如 Integer.valueOf(int))生成新对象:
- JDK 5+ 推荐使用
valueOf(),它内部先查缓存,未命中则执行new Integer(value) - 直接写
new Integer(200)也会创建新对象,但不推荐(绕过缓存逻辑,且效率低) - 自动装箱(如
Integer i = 200;)等价于Integer.valueOf(200),所以同样新建对象
验证是否新建对象:用 == 比较引用
缓存对象复用 → 相同值的缓存内对象引用相等;超出范围 → 引用不等:
Integer a = 100; // 在 [-128,127] 内 → 缓存 Integer b = 100; System.out.println(a == b); // true Integer c = 200; // 超出范围 → 新建 Integer d = 200; System.out.println(c == d); // false(引用不同) System.out.println(c.equals(d)); // true(值相等)
注意:缓存范围可通过 JVM 参数调整(仅限 Integer)
通过 -XX:AutoBoxCacheMax=N 可扩大 Integer 缓存上限(如设为 200),但 Byte/Short/Long/Character 的缓存范围是硬编码、不可配置。即使调大,也只是影响缓存区间,超出后依然新建对象。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











