自动装箱是编译器将基本类型隐式转为包装类(如int→Integer,调用valueOf()),拆箱则反之(如Integer→int,调用intValue);触发于赋值、方法调用、运算等上下文,null拆箱抛NPE,==比较受缓存范围影响。

Java 中包装类和基本类型之间的转换主要靠自动装箱(autoboxing)和自动拆箱(unboxing),但理解背后的机制和潜在陷阱很重要。
自动装箱与自动拆箱
从 Java 5 开始,编译器会在基本类型和对应包装类之间自动插入转换代码:
-
装箱:把基本类型转为包装类,比如
int → Integer -
拆箱:把包装类转为基本类型,比如
Double → double
例如:
Integer i = 100; // 自动装箱:int → Integer int x = i; // 自动拆箱:Integer → int Double d = 3.14; // 装箱 double y = d; // 拆箱
手动转换方式(显式调用)
虽然自动转换方便,但某些场景需显式操作,比如避免空指针或控制精度:
- 基本类型 → 包装类:调用
valueOf()(推荐)或构造器(已过时) - 包装类 → 基本类型:调用对应的方法如
intValue()、doubleValue()
示例:
Integer i = Integer.valueOf(42); // 推荐,利用缓存 int x = i.intValue(); // 显式拆箱 // 注意:new Integer(42) 已废弃,不建议使用
注意缓存机制(尤其 Integer)
Integer.valueOf(int) 在 -128 到 127 范围内会复用缓存对象,超出范围则新建对象:
Integer a = Integer.valueOf(100); Integer b = Integer.valueOf(100); System.out.println(a == b); // true(同一对象) Integer c = Integer.valueOf(200); Integer d = Integer.valueOf(200); System.out.println(c == d); // false(不同对象)
所以比较两个包装类是否相等,应始终用 equals(),而非 ==(除非确认都在缓存范围内且不关心可移植性)。
空值风险与拆箱异常
包装类变量可能为 null,直接拆箱会触发 NullPointerException:
Integer i = null; int x = i; // 运行时报 NullPointerException
安全做法:
- 先判空再拆箱:
if (i != null) x = i.intValue(); - 使用
Objects.requireNonNull(i).intValue() - 或用
Optional.ofNullable(i).orElse(0).intValue()
尤其在集合(如 List)、数据库映射、JSON 解析等场景中,null 很常见,务必检查。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











