为什么使用 == 比较两个整数有时有效有时无效?
Why Comparison Of two Integer using == sometimes works and sometimes not?
我知道我在使用 == 时比较参考,这不是一个好主意,但我不明白为什么会这样。
Integer a=100;
Integer b=100;
Integer c=500;
Integer d=500;
System.out.println(a == b); //true
System.out.println(a.equals(b)); //true
System.out.println(c == d); //false
System.out.println(c.equals(d)); //true
正在缓存 -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);
}
}
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);
}
Java 语言规范说至少 -128 到 127 的包装器对象被 Integer.valueOf()
缓存和重用,这被自动装箱隐式使用。
缓存 -128 到 127 之间的整数(相同值的整数引用相同 Object
)。比较你的 a
和 b
引用 returns true
,因为它们是相同的 Object
。你的c
和d
不在那个范围内,所以他们的参考比较returnsfalse
.
我知道我在使用 == 时比较参考,这不是一个好主意,但我不明白为什么会这样。
Integer a=100;
Integer b=100;
Integer c=500;
Integer d=500;
System.out.println(a == b); //true
System.out.println(a.equals(b)); //true
System.out.println(c == d); //false
System.out.println(c.equals(d)); //true
正在缓存 -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);
}
}
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);
}
Java 语言规范说至少 -128 到 127 的包装器对象被 Integer.valueOf()
缓存和重用,这被自动装箱隐式使用。
缓存 -128 到 127 之间的整数(相同值的整数引用相同 Object
)。比较你的 a
和 b
引用 returns true
,因为它们是相同的 Object
。你的c
和d
不在那个范围内,所以他们的参考比较returnsfalse
.