解题关键在于理解编译器补代码、valueOf()缓存机制(Integer为-128~127)、拆箱前必须非null;自动装箱/拆箱是语法糖,编译后转为valueOf()和xxxValue()调用,null拆箱必抛NPE。

解这类题,关键不是背结论,而是看懂编译后干了什么、运行时发生了什么。核心就三点:编译器补代码、valueOf() 有缓存、拆箱前必须非 null。
看清编译器偷偷干了啥
自动装箱和拆箱是语法糖,不是 JVM 运行时 magic。你写的代码会被编译器改写成显式调用:
- Integer i = 10; → 实际变成 Integer i = Integer.valueOf(10);
- int n = i; → 实际变成 int n = i.intValue();
- 同理,Double d = 3.14; 编译为 Double d = Double.valueOf(3.14);
所以遇到判断结果的题(比如 ==、equals、NPE),先 mentally 替换成这些方法调用,逻辑就清晰了。
记住 Integer 缓存范围是 -128 到 127
Integer.valueOf(int) 内部用了 IntegerCache,只对这个区间的整数复用对象。超出范围就 new 新对象:
立即学习“Java免费学习笔记(深入)”;
- Integer a = 127, b = 127; → a == b 是 true(同一个缓存对象)
- Integer c = 128, d = 128; → c == d 是 false(两个不同对象)
- new Integer(127) == new Integer(127) 永远是 false(每次 new 都是新地址)
注意:这个缓存只对 valueOf() 生效,new Integer() 不走缓存,也不推荐用。
拆箱前务必检查 null
包装类变量可以是 null,但基本类型不能。一旦对 null 包装类做拆箱操作,立刻抛 NullPointerException:
- Integer x = null; int y = x; → 直接报 NPE
- Integer x = null; System.out.println(x == 10); → 先拆箱再比较,同样 NPE
- 三目运算符中混用 null 和基本类型也危险: int z = flag ? x : 0; 如果 x 是 null,这里也会 NPE
这是高频踩坑点,面试官常用来考察是否真理解拆箱本质。
别忽略其他包装类的差异
缓存不是所有包装类都有,且范围不同:
- Boolean、Byte、Character、Short、Integer 有缓存机制
- Long、Float、Double 的 valueOf() 方法 没有缓存(JDK 规范未要求,主流实现也不缓存)
- Boolean.valueOf("true") 总是返回静态常量 TRUE/FALSE,所以 Boolean a=true, b=true; a==b 永远 true
遇到 Long 或 Double 的 == 判断题,基本可以默认是 false(除非值完全一样且是编译期常量)。


















