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了。