Java自动装箱与拆箱是基本类型与包装类间的隐式转换,Integer等缓存-128至127范围对象以复用内存,超出则新建;Boolean为单例,Float/Double不缓存;慎用==比较以防NPE。

Java 中的自动装箱(autoboxing)和拆箱(unboxing)是基本类型与对应包装类之间隐式转换的语法糖,但其背后涉及对象缓存机制,直接影响内存复用与 == 比较结果。理解缓存范围,关键在于记住:只有 Integer、Character、Byte、Short、Long 在特定取值范围内会复用缓存对象;Boolean 和 Float/Double 不参与该缓存策略。
Integer 缓存范围是 -128 到 127
这是最常考的细节。JVM(通过 Integer.valueOf() 实现)默认缓存 [-128, 127] 区间内的 Integer 对象。超出此范围时,每次装箱都会新建对象。
- 示例:Integer a = 100; Integer b = 100; System.out.println(a == b); // true(命中缓存)
- 示例:Integer c = 200; Integer d = 200; System.out.println(c == d); // false(各自 new)
- 该范围可通过 JVM 参数
-XX:AutoBoxCacheMax=256扩大(仅对 Integer 有效),但不会影响编译期常量折叠行为。
Character、Byte、Short、Long 的缓存逻辑类似但固定
它们的 valueOf 方法也实现缓存,且范围不可配置:
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
- Character:只缓存 '\u0000' 到 '\u007f'(即 0–127),超出即 new 对象
- Byte / Short:全部值域(-128~127、-32768~32767)均被缓存,因此 Byte 和 Short 装箱后 == 比较总是 true(只要值相等)
- Long:仅缓存 [-128, 127],与 Integer 一致
Boolean 和 Float/Double 不走对象缓存
它们的 valueOf 方法虽为静态工厂,但不复用实例:
立即学习“Java免费学习笔记(深入)”;
- Boolean:valueOf(true) 总返回同一个 TRUE 实例,valueOf(false) 总返回同一个 FALSE 实例 —— 这是单例,不是“范围缓存”
-
Float / Double:每次调用 valueOf 都返回新对象(JLS 明确禁止缓存浮点数包装类),所以
Float f1 = 1.0f; Float f2 = 1.0f; f1 == f2恒为 false
实际面试中高频陷阱题
考官常结合 ==、equals、null 安全性设问:
- 避免用 == 比较两个可能为 null 的包装类变量(会 NPE)
- Integer i = null; if (i == 0) → 拆箱触发 NullPointerException
- equals 比较更安全,但注意:new Integer(100).equals(100) 返回 true(因会先拆箱),而 100.equals(i) 编译不通过(基本类型无方法)

















