默认只有Integer在-128到127范围内有可配置缓存,其他包装类缓存范围固定或无缓存:Byte/Short/Character缓存-128~127但不可调,Boolean仅缓存true/false,Long/Float/Double不缓存;缓存仅对valueOf()和自动装箱生效,new总创建新对象。

Java 包装类缓存范围的核心就一条:只有 Integer 在 -128 到 127(含)之间有默认缓存,其他包装类要么没缓存,要么缓存范围固定且不可变。记不住?不是因为难,而是没抓住设计逻辑和记忆锚点。
Integer 缓存是唯一“可配置”的特例
Integer 的缓存范围默认是 -128 ~ 127,但可以通过 JVM 参数 -XX:AutoBoxCacheMax=N 扩大上限(比如设成 200),下限固定为 -128。这是所有包装类里唯一能调的。其他类如 Long、Short、Byte、Character 的缓存范围完全硬编码、不可修改:
- Byte、Short、Integer、Character:缓存 -128 ~ 127(但只有 Integer 的上限可调)
- Long、Float、Double:不缓存(注意:Float 和 Double 即使值相同,== 比较也几乎总是 false)
- Boolean:只缓存 true 和 false 两个实例(本质是枚举式单例)
缓存生效只发生在自动装箱(=)和 valueOf(),new 不走缓存
面试常考陷阱:用 new 创建的包装类对象永远不参与缓存比较。
-
Integer a = 100;→ 走缓存(在范围内) -
Integer b = Integer.valueOf(100);→ 同样走缓存 -
Integer c = new Integer(100);→ 新对象,== 比较为 false -
Integer d = 200;→ 超出默认缓存范围,新建对象(除非调了 -XX:AutoBoxCacheMax)
记住口诀:“整数一百二八,其余不动如山”
把关键数字和行为打包成一句话:
立即学习“Java免费学习笔记(深入)”;
- “整数” → 特指 Integer
- “一百二八” → -128 到 127 是安全缓存区
- “其余不动如山” → Byte/Short/Character 缓存范围也是 -128~127 但不可改;Long/Float/Double 不缓存;Boolean 只有两个实例
面试答题时,先说结论再补依据
别一上来就背范围。直接亮观点:
- “默认情况下,只有 Integer 在 [-128, 127] 区间内复用对象,这是为了节省内存和提升性能。”
- “其他基本类型包装类中,Boolean 固定复用 true/false;Byte、Short、Character 也缓存该区间但不可配置;Long、Float、Double 不做缓存。”
- “是否命中缓存,取决于是否通过 valueOf() 或自动装箱创建,new 总是新建对象。”


















