带有==和!=的Strange Wrapper Classes行为

Fer*_*deh 3 java wrapper

可能重复:
奇怪的Java拳击

最近,当我阅读有关包装类时,我遇到了这个奇怪的案例:

Integer i1 = 1000;
Integer i2 = 1000;

if(i1 != i2) System.out.println("different objects");

if(i1 == i2) System.out.println("same object");
Run Code Online (Sandbox Code Playgroud)

哪个印刷品:

different objects
Run Code Online (Sandbox Code Playgroud)

Integer i1 = 10;
Integer i2 = 10;

if(i1 != i2) System.out.println("different objects");

if(i1 == i2) System.out.println("same object");
Run Code Online (Sandbox Code Playgroud)

哪个印刷品:

same object
Run Code Online (Sandbox Code Playgroud)

这个案子有合理的解释吗?

谢谢

Bol*_*ock 9

==为第二种情况返回true 的原因是因为包装器装箱的原始值足够小,无法在运行时间隔到相同的值.因此他们是平等的.

在第一种情况下,Java的整数缓存不足以包含数字1000,因此您最终创建两个不同的包装器对象,比较哪个通过引用返回false.

可以在Integer#valueOf(int)方法中找到所述缓存的使用(IntegerCache.high默认为127):

public static Integer valueOf(int i) {
    if(i >= -128 && i <= IntegerCache.high)
        return IntegerCache.cache[i + 128];
    else
        return new Integer(i);
}
Run Code Online (Sandbox Code Playgroud)

正如Amber所说,如果您使用,.equals()那么两种情况都会返回true,因为它会在必要时将它们拆开,然后比较它们的原始值.