Java中Integer类的缓存问题

当我们在Java中打入一段代码

Integer a = 100, b = 100;

Integer c = 1000, d = 1000;

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

System.out.println(c==d);

根据我们对Java的认识,如果两个引用指向同一个对象,那么==判断的值是相等的,否则的话,即使两个引用指向的对象的内容相同,==判断的结果还是false。所以,我们可以初步判断最后这段代码显示的结果应该是两个false。然而,结果却是,第一个true,第二个false。为什么呢?实际上,这里的c==d是false没有问题的,问题就在为什么a==b是true呢?按照想法一步一步来,先用XJad(Java的反编译工具)把.class文件反汇编来看看,我们可以看到,字节码文件反汇编出来的结果是一下所示,

Integer integer = Integer.valueOf(100);
Integer integer1 = Integer.valueOf(100);
Integer integer2 = Integer.valueOf(1000);
Integer integer3 = Integer.valueOf(1000);
System.out.println(integer == integer1);
System.out.println(integer2 == integer3);

两者之间并没有太大的区别,都是使用了Integer.valueOf方法,那问题肯定就出在了valueOf方法上,我们再去Integer类的源代码中看valueOf方法的描述,结果如下所示,

public static Integer valueOf(int i) {
        if (i >= IntegerCache.low && i <= IntegerCache.high)
            return IntegerCache.cache[i + (-IntegerCache.low)];
        return new Integer(i);
}

好,很明显从这段代码中可以看出valueOf做了个小小的处理,涉及到了一个类,叫IntegerCache的类,从这个类上我们其实大致上已经可以猜出为什么a==b是true了,肯定是Integer类中对某一些数字做了缓存。再把IntegerCache类打开来看,发现实际上这个IntegerCache类是Integer的一个内部类,它将-128到+127的数字缓存到了Cache中,也就是高速缓存中,所以当值的范围在-128到+127,Integer的valueOf方法无需再new出一个新的Integer对象,而是直接从高速缓存中返回实例,又因为是同一个实例,所以这里的a==b的结果是true。

为什么Java要做这样的处理,我个人想了下有可能是Java的发明者认为小的数用的比较多,所以把他们放到缓存中可以提高程序运行效率。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值