先看一段代码
Integer i1 = 1813;
Integer i2 = 1813;
System.out.println(i1==i2);
Integer i3 = 127;
Integer i4 = 127;
System.out.println(i3==i4);
打印结果:
false
true
i1==i2 结果是false容易理解,对象的比较嘛,==比较的是引用,不同的对象引用地址不一样;
那么i3==i4 结果是true又是为什么呢?
当我们给一个Integer赋予一个int类型的时候会调用Integer的静态方法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);
}
在IntegerCache中cache数组初始化如下,存入了-128 - 127的值
cache = new Integer[(high - low) + 1];
int j = low;
for( int k = 0; k < cache.length ; k ++)
cache[k] = new Integer(j ++);
从上面我们可以知道给Interger 赋予的int数值在-128 - 127的时候,直接从cache中获取,这些cache引用对Integer对象地址是不变的,但是不在这个范围内的数字,则new Integer(i) 这个地址是新的地址,不可能一样的
所以以后比较应该这么写法:
Integer i1 = 1813;
Integer i2 = 1813;
System.out.println(i1.intValue()==i2.intValue());