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 都新建对象
缓存范围能改吗?
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 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
不复杂但容易忽略

















