Integer自动装箱、自动拆箱

来源:互联网 发布:阿里云 可用区a 编辑:程序博客网 时间:2024/06/11 11:06
//代码段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
0 0