自动装箱与拆箱是编译器语法糖:装箱调用valueof()(如integer.valueof(100)),复用缓存(-128~127);拆箱调用xxxvalue()(如intvalue()),null时抛npe;仅适用于8种基本类型及其包装类,需避免==比较和循环中频繁转换。

Java 中包装类的自动装箱(autoboxing)和拆箱(unboxing)是编译器在基本类型与对应包装类之间自动转换的机制,无需手动调用构造方法或 xxxValue() 方法。
自动装箱:基本类型 → 包装类
当需要包装类对象但提供的是基本类型值时,编译器自动调用对应包装类的静态工厂方法(如 Integer.valueOf()),而非构造器(如 new Integer())。这更高效,且会复用缓存对象(如 Integer 在 -128~127 范围内)。
-
✅ 正确示例:
Integer i = 100; // 自动装箱,等价于 Integer.valueOf(100)Boolean b = true; // 等价于 Boolean.valueOf(true)List<integer> list = Arrays.asList(1, 2, 3); // 每个 int 自动装箱为 Integer</integer> -
⚠ 注意:不要用
==比较两个装箱后的Integer(尤其超出缓存范围时),应使用.equals()。
自动拆箱:包装类 → 基本类型
当需要基本类型值但提供的是包装类引用时,编译器自动调用对应包装类的 xxxValue() 方法(如 intValue()、booleanValue())。
-
✅ 正确示例:
Integer i = 42;<br>int x = i; // 自动拆箱,等价于 i.intValue()
if (b) { ... } // Boolean b 自动拆箱为 boolean 进行条件判断 -
⚠ 风险:若包装类引用为
null,拆箱会抛出NullPointerException。
例如:Integer i = null; int x = i; // 运行时报 NPE
哪些类型支持自动装箱/拆箱?
仅限 Java 的 8 个基本类型及其对应包装类:
-
byte↔Byte -
short↔Short -
int↔Integer -
long↔Long -
float↔Float -
double↔Double -
char↔Character -
boolean↔Boolean
String、Object 等非包装类不参与该机制。
常见陷阱与建议
- 避免在循环中频繁装箱/拆箱(如
for (int i : list)遍历List<integer></integer>),可能影响性能;大数据量时考虑用原始类型集合库(如 Eclipse Collections、Trove)。 - 判空后再拆箱:使用前检查是否为
null,或用Objects.requireNonNull(i, "i must not be null")明确失败语义。 - 比较用
.equals(),不依赖==;数值计算前确保非空。 - 明确知道缓存范围(如
Integer.valueOf()缓存 -128 到 127),避免因缓存导致的意外相等行为误导逻辑。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











