自动装箱和拆箱是一个老生常谈的问题了,今天我们谈一下我对这两个概念的理解。
一、自动装箱
java中一共有八种基本类型的数据,对于这些基本类型的数据都有一个对应的包装器类型。比如int——Integer等;
在javaSE5之前,如果需要对实现一个Integer对象必须如下:
Integer a = new Integer(10);
从JavaSE5开始就有了自动装箱的特性,如下:
//装箱
Integer i = 10;
Integer i= Integer.valueOf(10);
//拆箱
int n = i;
那么上面的装箱和拆箱是如何实现的呢?
装箱的时候会调用Integer.vlaueOf方法,拆箱的时候会自动调用intValue方法。
那么什么时候装箱和拆箱呢?
1、对象初始化时候装箱。如:Integer i = 10;
2、使用表达式的时候拆箱。如:i+i
3、基本类型赋值时候拆箱。如:int a = i;
4、使用equals方法时候装箱。如:i.equals(表达式)。
猜一下下面的结果:
Integer a = 1;
Integer b= 2;
Integer c= 3;
Integer d= 3;
Integer e= 321;
Integer f= 321;
Long g= 3L;
Long h= 2L;
System.out.println(c==d);
System.out.println(e==f);
System.out.println(c==(a+b));
System.out.println(c.equals(a+b));
System.out.println(g==(a+b));//a+b中a和b都是Integer类型,会先触发自动拆箱,变成int类型。然后触发自动装箱,变成Integer类型。类型不一样false
System.out.println(g.equals(a+b));
System.out.println(g.equals(a+h));
结果:
true
false
true
true
true
false
true