所谓自动装箱,就是把基本数据类型用他们对应的引用类型包装起来,使他们可以具有对象的特质。例如我们可以把int类型包装成Integer类型的,把double类型的包装成Double类型的。
所谓拆箱,就是进行与自动装箱相反的操作。
自动装箱的过程:当需要一种类型的对象时,这种基本数据类型就自动封装到与它对应的包装类中。
自动拆箱的过程:当需要一个数值时,被装箱的对象中的值就会被自动提取出来,没有必要再去调用intValue()和doubleValue()等方法。
public static void main(String[] args) {
Integer a=100;
Integer b=100;
Integer c=200;
Integer d=200;
System.out.println(a==b);//1
System.out.println(a==100);//2
System.out.println(c==d);//3
System.out.println(c==200);//4
}
在java中,"=="比较的是对象的引用,而不是值(value),自动装箱后a,b,c,d都是Integer类型的对象,因此"=="比较的是其引用。按照常规思维1和3应该是false,但是结果是:
true
true
false
true
2和4是因为进行了自动拆箱,比较的是基本数据类型,因此"=="比较的是其数值,结果数true。
对于结果1,虽然比较的是对象的引用,但是自动装箱时,java在编译的时候Integer a=100,被编译成Integer a=Integer.valueOf(100)。因此,关键就在于valueOf()这个方法。
再看下面的例子:
Integer aa=-128;
Integer bb=-128;
System.out.println(aa==bb);
Integer cc=-129;
Integer dd=-129;
System.out.println(cc==dd);
Integer ee=127;
Integer ff=127;
System.out.println(ee==ff);
Integer gg=128;
Integer hh=128;
System.out.println(gg==hh);
上面代码输出的结果是:
true
false
true
false
说明当Integer类型后面赋值范围在-128---127之间时,都会返回true,否则返回false。
总结:
事实上,java为了提高效率,IntegerCache类中有一个数组缓存了值从-128到127的Integer对象。当我们调用Integer.valueOf(int i)的时候,如果i的值是>=-128且<=127时,会直接从这个缓存中返回一个对象,否则就new一个Integer对象。