- 装箱是指基本数据类型转化为包装类型。
- 拆箱是指包装类型转化为基本数据类型。
在jdk5.0之前,是由程序员自己进行手动装箱与拆箱,具体代码如下。拿Integer 与 int类型来举例说明。
public class ObjectDemo3 {
public static void main(String[] args) {
int a = 10;
// 装箱 1
Integer a1 = Integer.valueOf(a);
// 装箱2
Integer a2 = new Integer(a);
System.out.println(a1);
System.out.println(a2);
// 拆箱
int a3 = a1.intValue();
System.out.println(a3);
}
}
但是在jdk5.0之后,就实现了自动装箱与拆箱,底层原理与我们手动操作是一样的。为了直观看到装箱与拆箱过程,直接追溯源码。打上断点进行debug调试
点击step into 我们就直接来到了 valueOf(),执行完该方法后 int类型将会被转化为Integer包装类型,这样就实现了 自动装箱。。
自动拆箱与手动拆箱调用的方法一样,都是intValue(),将Integer包装类型转化为int基本数据类型
关于自动装箱,还有一点特别重要,就是 包装后的Integer对象地址问题,这点的关键就是valueOf(),我们可以看到 如果传入的 int值在 -128~127之间,此时就不会创建Integer对象,而是返回 cache数组中对应元素。此时直接查看cache数组源码。。
因此low = -128 high = 127, 这时我们就知道了 cache数组长度为 256,里面的元素为分别是 -128 ~ 127。 因此只要传入的int值在这范围之内的,就不会创建对象,而是直接返回cache数组中对应元素的地址值。如果传入的int值不在这个范围之内,那么就会重新new Integer()



