为什么 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);
}