前言:在jdk1.5版本以后出现了这个概念,主要是为了将基本的数据类型转换成为包装的数据类型,或者将包装的数据类型转换成为基本的数据类型
基本数据类型:char 、byte、int 、long 、double、float、boolean
包装数据类型:比如int 的包装数据类型是 Integer、 double 的数据类型是Double
装箱代码示例:
int i = 10;
// 自动装箱,Java 编译器将其转化为 Integer integer = Integer.valueOf(i);
Integer integer = i;
拆箱代码示例:
Integer integer = new Integer(10);
// 自动拆箱,Java 编译器将其转化为 int i = integer.intValue();
int i = integer;
注意事项:
- 每次装箱操作都可能涉及到对象的创建,而拆箱操作可能涉及到方法调用。频繁的装箱和拆箱操作可能会导致性能下降,特别是在大量数值计算的场景中。
- 在自动拆箱过程中,如果包装类对象为**
null
**,那么尝试拆箱将会抛出空指针异常。 - 对于某些小的数值,如Integer类缓存了从-128到127的整数,因此在这个范围内的装箱操作可能不会创建新的对象。这是一种优化,但如果不了解这一点,可能会导致错误的假设和错误。
思考: 为什么会这样 在自动拆箱过程中,如果包装类对象为null,那么尝试拆箱将会抛出空指针异常。
答:在拆箱的过程中会调用原来包装类中的方法 获取基本类型的参数值 如果这个时候为空的话,那么就会报错
示例代码:
Integer integerObject = new Integer(10);
int i = integerObject; // 自动拆箱
上述代码编译以后的结果:
int i = integerObject.intValue();
总结:不难发现:上述的代码在进行拆包的过程中 会调用包装类中的方法 如果这个时候为空的会就抛出异常。
进一步演示:
Integer myInteger = null;
int myInt = myInteger; // 抛出 NullPointerException
在上述代码中,由于myInteger 是null,在执行myInteger .intValue()时,
JVM无法找到一个有效的对象来执行这个方法,因此它抛出NullPointerException。
解决拆箱出现错误的处理方法:
Integer integerObject = ...; // 可能为null的来源
if (integerObject != null) {
int i = integerObject; // 安全的拆箱
} else {
// 处理null情况或分配一个默认值
int i = 0; // 或其他业务逻辑需要的值
}