java包装类缓存机制仅适用于byte、short、integer、long(-128~127)、character(0~127)和boolean(true/false),float与double无缓存;integer缓存上限可通过-xx:autoboxcachemax配置,其余不可调;仅valueof()及自动装箱触发缓存,new必新建对象。

Java包装类数值缓存是面试高频考点,查题和准备要抓准核心逻辑,不是死记硬背。重点看三点:哪些类有缓存、缓存范围是多少、怎么触发缓存。
哪些包装类有缓存?
只有这5种有:
- Byte、Short、Integer、Long → 缓存 [-128, 127](含两端)
- Character → 缓存 [0, 127](即 '\u0000' 到 '\u007F')
- Boolean → 只缓存 true 和 false 两个实例
- Float 和 Double → 没有缓存机制,每次 new 或 valueOf 都新建对象
缓存范围能改吗?
- Integer 的上限(默认127)可通过 JVM 参数调整:
-XX:AutoBoxCacheMax=200(注意:下限 -128 固定不可改) - 其他如 Byte/Short/Long 的缓存范围在源码里写死,无法配置
- Character 缓存上限 127 也是硬编码,不可调
怎么判断是否走缓存?
关键看创建方式:
- ✅ 走缓存:
Integer.valueOf(100)、Integer a = 100(自动装箱,底层调 valueOf) - ❌ 不走缓存:
new Integer(100)(无论值多少,一定新建对象) - ⚠️ 比较陷阱:用
==时,只对缓存内值返回 true;超出范围或用 new 就是 falseInteger a = 127, b = 127; System.out.println(a == b); // true Integer c = 128, d = 128; System.out.println(c == d); // false Integer e = new Integer(127), f = new Integer(127); System.out.println(e == f); // false
不复杂但容易忽略
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











