浅谈java中的自动拆装箱
Java在jdk1.5之后推出的一个新特性:自动拆装箱。 该特性不是jvm认可的,而是编译允许
public class Integerdemo03 {
public static void main(String[] args) {
/**
* 编译器在编译下列代码时补充了代码
* Integer n= Integer.valueOf(1);
* 自动装箱
*/
int a=100;
Integer n=100;
Integer m=100;
包装类的实例可以与数值类型的值进行比较,这种比较是直接取出包装类的实例所包装的数值来进行比较的。所以下面的代码返回true。
System.out.println(a==n);//true
Integer有一个静态方法valueOf(int i),当自动装箱触发时,编译器会自动补充调用该方法的代码。而通过查看Integer类的源码可知,在static
静态代码块中,系统把-128-127之间的整数自动装箱成Integer实例,并且缓存在一个名为cache的数组中。当你把一个-128-127之间的
整数自动装箱成Integer实例时,实际上是直接指向对应的数组元素,因此-128-127之间的相同的整数自动装箱成Integer实例时,永远都
是引用cache数组中的同一个元素,所以它们全部相等。所以下面的代码返回true。但是如果当valueOf(int i) 中的i不在-128-127的范围之内
即便是两个值相同的i,自动装箱成Integer实例以后,==比较的结果将会是false。因为如果i不在缓存值范围内,则会new出新的对象,这时即
使i的值相等,也会new出两个对象,==比较自然是false。
System.out.println(m==n);//true
valueOf()源码如下
public static Integer valueOf(int i) {final int offset = 128;
if (i >= -128 && i <= 127) { // must cache
return IntegerCache.cache[i + offset];
}
return new Integer(i);
}
/**
* 编译器在编译下面的代码时
* 补充了代码:int b=n.intValue();
*/
int b=n;
System.out.println(b==a);//true 两个int值比较大小
System.out.println(b==n);//true 包装类的实例与数值类型进行比较
}
}