工作中偶然遇到下面的问题,mark以下
Integer数值比较。下面展示测试代码。
public static void main(String[]args){
testInteger();
}
public static void testInteger() {
Integer c = 127;
Integer d = 127;
assertOut("=--------------------------整形127--------------------------------");
assertOut(c == d); //true
Integer e = 128;
Integer f = 128;
assertOut("=--------------------------整形128--------------------------------");
assertOut(e == f); //false
}
为何Integer对象等于127便相等,而等于128则不等
Integer c = 127 ; 等价于 Integer c = Integer.valueOf(127);
Integer b = 128 ; 等价于 Integer b = Integer.valueOf(128);
Java的Integer使用过程中存在缓存,请看下面Java代码
int low = -128;
int high = 127;
Integer [] cache = new Integer[(high - low) + 1];
int j = low;
for(int k = 0; k < cache.length; k++)
cache[k] = new Integer(j++);
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
Integer的缓存范围为:-128~127,当数值不再这个范围内的时候便会 创建新的Integer对象而不同对象之间的直接是不想等的(两个对象的物理地址不同)。