为什么 Java 中的 (Integer) 222 != (Integer) 222?
Why (Integer) 222 != (Integer) 222 in Java?
它适用于 (Integer) 1 == (Integer) 1
,这似乎是合理的。
那么为什么它会偏移 (Integer) 222
的等式?
Integer
是一个 class。因此,要比较对象,您需要使用 equals
而不是 ==
较短的 Integer 实际发生的情况是,如果您使用方法 valueOf
获得 Integer
,您将始终获得相同的缓存实例,其值介于 -128 和 127 之间。因此在这种情况下 ==
有效。
如果您不使用 valueOf
而使用运算符 new
显式创建一个新实例,则它不起作用。
为了更清楚,我写了 valueOf
的当前实现
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);
}
它适用于 (Integer) 1 == (Integer) 1
,这似乎是合理的。
那么为什么它会偏移 (Integer) 222
的等式?
Integer
是一个 class。因此,要比较对象,您需要使用 equals
而不是 ==
较短的 Integer 实际发生的情况是,如果您使用方法 valueOf
获得 Integer
,您将始终获得相同的缓存实例,其值介于 -128 和 127 之间。因此在这种情况下 ==
有效。
如果您不使用 valueOf
而使用运算符 new
显式创建一个新实例,则它不起作用。
为了更清楚,我写了 valueOf
的当前实现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);
}