关于Java中的Integer

这是CSDN上的一个帖子,问题如下:

public static void main(String[] args) {

        Integer a = 128;

        Integer b = 128;

        System.out.println(a == b);

    }

请问输出结果是什么,并给出解释。

-------------------------------------------------------------------------------

输出结果为:false,分析如下:

首先,看看Integer的封装吧:

    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);

        }
当你直接给一个Integer对象一个int值的时候,其实它调用了valueOf方法,然后你赋的这个值很特别,是128,那么没有进行cache方法,相当于new了两个新对象。所以问题中定义a、b的两句代码就类似于:

        Integer a = new Integer(128);

        Integer b = new Integer(128);
这个时候再问你,输出结果是什么?你就知道是false了。如果把这个数换成127,再执行:

        Integer a = 127;

        Integer b = 127;

        System.out.println(a == b);
结果就是:true

由上可知,我们进行对象比较时最好还是使用equals,便于按照自己的目的进行控制。

--------------------------------------------------补充-----------------------------------------------------------------------

我们看一下IntegerCache这个类里面的内容:

    private static class IntegerCache {

       private IntegerCache() {

       }

       static final Integer cache[] = new Integer[-(-128) + 127 + 1];

 static {

           for (int i = 0; i < cache.length; i++)

              cache[i] = new Integer(i - 128);

       }

    }

由于cache[]在IntegerCache类中是静态数组,也就是只需要初始化一次,即static{......}部分,所以,如果Integer对象初始化时是-128~127的范围,就不需要再重新定义申请空间,都是同一个对象---在IntegerCache.cache中,这样可以在一定程度上提高效率.


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值