java中自动装箱与拆箱

143 阅读2分钟

背景

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 
		 
	}

字节码层面 1693390963949

可以看到 i1 == i2 + i3 时进行拆箱,拆箱完后属于基本数据类型,java中基本类型的 == 是直接比对其值的,所以会相等。