1

我对以下代码有疑问:

public class Equivalence {
    public static void main(String[] args) {
        Integer n1 = new Integer(47);
        Integer n2 = new Integer(47);
        System.out.println(n1 == n2);
        System.out.println(n1 != n2);
    }
}

结果输出让我感到惊讶:

false
true

我已经在线检查了 Javadoc 中的构造函数,没有任何帮助。

提前致谢

谢谢

4

5 回答 5

4

您应该使用equals来检查值相等。因为 Integer 是包装 int 值的包装类。==根据参考检查相等性,因此在这两种情况下您的参考都是不同的。

将此对象与指定对象进行比较。当且仅当参数不为 null 并且是包含与此对象相同的 int 值的 Integer 对象时,结果才为真。

 n1.equals(n2);

如果你这样做

int n1 = new Integer(47);
int n2 = new Integer(47);

你会得到你期望的输出。

因为Java维护整数池,127-128也可以这样做

 Integer n1 = Integer.valueOf(47);
 Integer n2 = Integer.valueOf(47);<-- will return you the same reference
     n1==n2 >>> True
于 2012-11-03T20:20:52.993 回答
3

只有原始类型可以可靠地与 进行比较==。对于对象(并且Integer是对象类型),equals()应该使用方法。

==可用于对象,但仅用于检查两个对象是否实际上相同。例如:

Integer n1 = new Integer(47);
Integer n2 = n1;
// n1 == n2 will be true

最好将ints 视为数字本身,并将Integers 视为写有数字的便利贴。==仅当您谈论的是相同的便利贴equals()时才会返回 true,但是对于上面具有相同编号的任何两个便笺将返回 true。

使问题复杂化的是,自 1.5 版以来,Java 还具有自动装箱功能,即ints 会在需要时自动转换为Integer,反之亦然。如果您不小心,这可能会导致非常令人惊讶的结果。

于 2012-11-03T20:23:21.463 回答
1

n1 == n2,比较对象实例,因此n1 == n2将返回并将false作为和不同的对象实例返回。n1 != n2truen1n2

如果您使用equals方法或获取int (primitive tpye)值,然后使用比较,== or !=您将得到正确的结果,例如

    System.out.println(n1.equals(n2)); //true
    System.out.println(!n1.equals(n2));//false

或者

    System.out.println(n1.intValue() == n2.intValue()); //true
    System.out.println(n1.intValue() != n2.intValue()); //false
于 2012-11-03T20:23:44.473 回答
1

我相信这是因为您没有比较 n1 和 n2 的值,而是在比较对象引用。而且由于它们是两个不同的对象,它们的引用是不一样的。

因此,您应该使用 equals() 方法来比较它们的值

于 2012-11-03T20:24:09.453 回答
1

java.Lang.Integerobject在java中是一个。equals()您应该使用方法检查两个 Integer 对象是否相等

您正在检查 n1 对 Integer 对象的引用和 n2 对另一个 Integer 对象的引用是否指向同一个 Integer 对象。因为==运算符检查两个引用变量是否引用同一个对象。在这种情况下,他们不是。尝试

              Integer n1 = New Integer(47);
              Integer n2 = New Integer(47);
              System.out.println(n1.equals(n2));
              System.out.println(n1.equals(n2));
于 2012-11-03T20:24:46.550 回答