装箱(Boxing)
装箱是指将:基本数据类型,转换为它们对应的包装类对象。
例如:将一个int
类型转换为Integer
对象,如下所示:
// 装箱:将基本数据类型转换为对象类型 int num = 10; Integer obj = Integer.valueOf(num); // 显式装箱 Integer autoObj = num; // 自动装箱
拆箱(Unboxing)
拆箱是指:将从一个包装类对象,转换为基本数据类型值。
如下所示:
Integer boxedInt = Integer.valueOf(42); int primitiveInt = boxedInt.intValue(); // 手动拆箱 int primitiveInt = boxedInt; // 自动拆箱
为什么需要装箱和拆箱
1. 类型一致性
在许多编程语言中,基本数据类型(如int、char、float等)与对象类型(如Integer、Character、Float等)有不同的用途和特性。
例如:在Java中,集合类(如ArrayList、HashMap)只能存储对象类型。
如下所示:
List<Integer> list = new ArrayList<>(); int num = 42; list.add(num); // 自动装箱
如果你希望将基本数据类型存储到这些集合中,就需要将其装箱为对应的对象类型。
2. 面向对象的设计
面向对象编程(OOP)的很多特性和设计模式都依赖于对象类型。
例如,多态性和继承是OOP的重要特性,而这些特性只对对象类型有效。
如下所示:
int num = 10; Object obj = num; // 自动装箱,将int转换为Integer printObject(obj); // 输出:10
通过装箱,可以将基本数据类型转换为对象类型,使其能够利用OOP的优势。
3. 统一操作
有时我们希望对不同类型的数据,进行统一的处理。
例如:函数参数可以是基本数据类型、或对象类型,如果直接使用对象类型,可以避免写重复的代码。
如下所示:
public class UnifiedProcessingExample { public static void main(String[] args) { processNumber(10); // 自动装箱 processNumber(10.5); // 自动装箱 processNumber(true); // 自动装箱 } public static void processNumber(Object obj) { // 可以处理所有基本数据类型和对象类型 System.out.println(obj); } }
通过装箱和拆箱,可以实现这种统一的操作。
装箱与拆箱注意事项
装箱和拆箱在编程中,有助于统一处理原始类型和对象类型。
但需要注意的是,这些操作可能会影响性能,特别是在频繁进行装箱和拆箱操作时。
所以,在需要高性能的情况下,尽量使用基本数据类型,而不是包装类型,以避免不必要的装箱和拆箱操作。
mikechen
mikechen睿哥,10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。
关注「mikechen」公众号,获取更多技术干货!

后台回复【架构】即可获取《阿里架构师进阶专题全部合集》,后台回复【面试】即可获取《史上最全阿里Java面试题总结》