背景
java中为了提高效率引入基本数据类型,这些基本数据类型是参考C++方式,用在栈上存储的方式替代在堆上创建,提高内存分配效率与减少垃圾回收的消耗。 由于java本身是面向对象语言,在集合等某些场景只能存在对象,故java提供了自动拆箱与装箱功能,减少开发者的手动转化。
何为装箱与拆箱
装箱: 将int值转化成Integer对象操作,就是调用Integer.valueOf(a)这一方法。自动装箱就是:不用开发人员编写这一段代码,编译器编译时看情况(放入集合中)
主动帮我们增加这一行代码
拆箱: 本质上就是调用a.intValue()这一方法。自动装箱就是:不用开发人员编写这一段代码,编译器编译时看情况(进行运算时)
主动帮我们增加这一行代码
装箱与拆箱底层实现
装箱:
可以看到这里面对于-128 -> IntegerCache.high 的值装箱时会使用到缓存, 而这个区间外的,每次装箱会产生一个新对象。
IntegerCache.high 默认值为127, 可以通过
拆箱:
拆箱就更简单,直接返回对象中的成员变量即可。
实际运用
private static void test1() {
Integer i1 = 40;
Integer i2 =40;
Integer i3 =0;
Integer i4 = new Integer(40);
Integer i5 = new Integer(0);
Integer i6 = Integer.valueOf(40);
System.out.println(i1 == i2); //1. true 有缓存 位于-128 -》127缓存
System.out.println(i1 == i2 + i3); //2. true 拆箱
System.out.println(i1 == i4); //3. false
System.out.println(i1 == i4 + i5); //4. true 拆箱
System.out.println(i1 == i6); //5. true
}
private static void test2() {
Integer i1 = 200;
Integer i2 = 200;
Integer i3 =0;
Integer i4 = new Integer(200);
Integer i5 = new Integer(0);
Integer i6 = Integer.valueOf(200);
System.out.println(i1 == i2); //6. false 超出-128 -》127缓存
System.out.println(i1 == i2 + i3); //7. true 拆箱
System.out.println(i1 == i4); //8. false
System.out.println(i1 == i4 + i5); //9. true 拆箱
System.out.println(i1 == i6); //10. false
}
字节码层面
可以看到 i1 == i2 + i3 时进行拆箱,拆箱完后属于基本数据类型,java中基本类型的 == 是直接比对其值的,所以会相等。