天天看点

什么是Java的自动拆箱和自动装箱

自动拆箱和自动装箱是jdk1.5推出的特性。

那么,什么是自动拆箱和自动装箱呢?

先看例子:

Integer i1 = new Integer(10);
Integer i2 = new Integer(20);

System.out.println(i1);
System.out.println(i2);      

这里输出的分别是对应的10和20

Integer i3 = 10;
Integer i4 = 20;

System.out.println(i3);
System.out.println(i4);      

这里输出的也是10和20

其实自动装箱,就是自动将基本数据类型转换为包装器类型,即java会自动帮我们调用valueof方法。

拆箱则是自动将包装器类型装换成基本数据类型,但要强调的是拆箱调用的是Integer的intValue方法。

那Integer i = new Integer(1)和Integer i = 1有什么区别呢?

 1.第一种方法不会触发自动装箱的过程;而第二种方法会触发

 2.在执行资源和资源占用上的区别。第二种方法的执行效率和资源占用在一般情况下要优于第一种情况(但要注意这并不是绝对的,因为如果刚好调用了内存里面已经存在的同一个资源的话,那么它会直接从缓存区里面拿出来,而不会去新开内存)

在这里要注意的一点就是,当装箱的值超过规定范围(-127~128)时,它不会从缓存区拿出缓存好的对象,而是要新开一个,所以会导致以下代码输出不一致的问题:

Integer i1 = 100;
Integer i2 = 100;
Integer i3 = 200;
Integer i4 = 200;
System.out.println(i1==i2);  //trueSystem.out.println(i3==i4);  //false
//这里i3和i4会创建两个不同的对象,因为超出范围了