Integer自动装箱、自动拆箱

//代码段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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值