装箱是基本类型转包装类,拆箱反之;Java 5起支持自动装箱/拆箱,编译器自动转换,简化代码但可能引发性能问题、空指针异常和比较陷阱,需注意集合操作、参数传递等场景中的隐式转换风险。

在Java中,装箱、拆箱与自动装箱是基本数据类型与对应的包装类之间转换的重要机制。理解它们有助于写出更高效、更清晰的代码,尤其是在集合操作和泛型使用中。
什么是装箱与拆箱?
装箱(Boxing)是指将基本数据类型转换为对应的包装类对象的过程。Java为每种基本类型都提供了包装类,比如 int → Integer、double → Double 等。
例如:
Integer i = new Integer(10); // 手动装箱(已过时)
立即学习“Java免费学习笔记(深入)”;
拆箱(Unboxing)则是将包装类对象转换回基本数据类型。
例如:
int x = i.intValue(); // 手动拆箱
什么是自动装箱与自动拆箱?
从Java 5开始,引入了自动装箱(Autoboxing)和自动拆箱(Auto-unboxing)机制,编译器会自动完成基本类型与包装类之间的转换,无需手动调用构造方法或 xxxValue() 方法。
示例:
Integer a = 100; // 自动装箱:int → Integer
int b = a; // 自动拆箱:Integer → int
这种写法简洁,但在某些情况下可能带来性能开销或空指针异常。
常见应用场景与注意事项
自动装箱拆箱在以下场景中频繁出现:
- 集合类操作:List
只能存对象,添加 int 会自动装箱 - 方法参数传递:当方法接收包装类型,传入基本类型时触发装箱
- 表达式运算:包装类参与算术运算时会自动拆箱
需要注意的问题:
- 性能问题:频繁的装箱拆箱会产生大量临时对象,影响性能,尤其在循环中
- 空指针风险:对值为 null 的包装类进行拆箱会抛出 NullPointerException
- == 比较陷阱:Integer 在 -128 到 127 范围内缓存,超出范围用 == 比较可能不相等
总结
装箱是基本类型转包装类,拆箱则相反。自动装箱/拆箱让代码更简洁,但不应忽视其背后的对象创建和潜在异常。在性能敏感或可能为空的场景中,建议显式处理或优先使用基本类型。
基本上就这些,掌握原理后能更好避免坑。










