//代码段1
Integer i1=200;
Integer j1=200;
System.out.println(i1==j1);
//代码段2
Integer i2=100;
Integer j2=100;
System.out.println(i2==j2);
复制代码
这两段代码的结果分别是多少?
JDK1.6上执行代码段1的结果为false,代码段2的结果为true.
实验1:在JDK1.4下代码段1不能编译通过的,会提示:“ Type mismatch: cannot convert from int to Integer”的错误,改写为:“Integer i1 = new Integer(200); Integer j1 = new Integer(200);”,编译正常。
两段代码运行结果为false,true,代码段1由于是对象使用==比较,比较的是两个对象的地址,所以为false(这个大家都应该明白了)。
实验2: 在JDK1.5下代码段1可以编译通过,因为其实现了自动装箱(Autoboxing)和自动拆箱(Auto-Unboxing)。
两段代码运行结果为false,true
从实验2就可以看出,问题出在了装箱/拆箱过程,通过反编译,找出Integer赋值调用的是Integer.valueOf方法,查JDK源代码,如下所示:
public static Integer valueOf(int i) {
if(i >= -128 && i <= IntegerCache.high)
return IntegerCache.cache[i + 128];
else
return new Integer(i);
}
jdk1.8中改进为:
public static Integer valueOf(int i) {
assert IntegerCache.high >= 127;
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
看到这里,我想大家都应该明白为什么会是false了。原来在装箱时,将-128<=i1<=127范围之内的数据打包成缓存里的Integer对象了,由于不用new,所以这个区间里的值用直接=赋值方法得到的变量地址就是同一个,而超出这个范围的数值就会new一个Integer对象出来,用==运行符来计算,怎么也不可能为true。
Integer自动装箱、自动拆箱
最新推荐文章于 2018-09-17 22:50:21 发布