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

时间:2011-01-09 06:45:58

标签: java wrapper

  

可能重复:
  Weird Java Boxing

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

Integer i1 = 1000;
Integer i2 = 1000;

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

if(i1 == i2) System.out.println("same object");

打印哪些:

different objects

Integer i1 = 10;
Integer i2 = 10;

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

if(i1 == i2) System.out.println("same object");

打印哪些:

same object

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

由于

3 个答案:

答案 0 :(得分: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);
}

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

答案 1 :(得分:1)

整数i1 = 1000;

编译器将其理解为int i1 == i2 // return true

但是i1i2很大= =测试返回false

Integer i1 = 10000000;
Integer i2 = 10000000;

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

if(i1 == i2) System.out.println("same object"); // false

通知:

Integer i1 = 100;
Integer i2 = 100;

System.out.println(i1 == i2); // true

i1 = 1000000;
i2 = 1000000;

System.out.println(i1 == i2); // false

不要使用==测试对象的等式。它只是比较他们的参考。 .equal()检查两个对象是否相同。

Integer i1 = 1000000;
Integer i2 = 1000000;

i1 == i2 // false
i1.equals(i2) // true

答案 2 :(得分:-1)

我刚试过这个,所有打印的都是

different objects

正如预期的那样,因为您正在创建两个不同的包装器对象,即使它们碰巧包含相同的值。

正如Amber在上述评论中暗示的那样,

if(i1.equals(i2)) System.out.println("same value");

确实打印

same value