Integer缓存之IntegerCache

本文详细解析了Java中Integer对象在-128至127范围内的缓存机制,通过源码分析解释了该范围内Integer对象的比较为何会返回true,而超出此范围的对象比较则返回false。
Integer iii = -129;
Integer iV = -129;
System.out.println(iii == iV);
Integer iii = 0;
Integer iV = 0;
System.out.println(iii == iV);

 大家知道上面两端代码打印什么结果吗?(输出分别是 false 和 true)

 今天偶然间在调试的时候按了F5进入了Integer源码,当我们进行Integer i = 0  赋值的时候,首先调用

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

  里面的判断很清晰,当值处于-128 和 127直接的时候从缓存内拿,我们再看下缓存类是怎么构造的

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

代码很简单,就是一个静态块,当Integer类加载的时候,它的缓存就直接初始化将Integer对象-127 到 128全创建了,所以当我在进行 Integer i= 0; 和 Integer ii =0 比较时比较的是同一个Integer对象,而当我们赋值在 -127到128直接时是新创建的两个对象所以肯定是返回false了。

 

 

转载于:https://my.oschina.net/francis0115/blog/336372

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值