平等算子,奇怪的结果?

时间:2012-11-03 20:19:50

标签: java

我对以下代码有疑问:

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中的构造函数,没有任何帮助。

提前致谢

谢谢

5 个答案:

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

答案 1 :(得分:3)

只能将原始类型与==进行可靠的比较。对于对象(Integer是对象类型),应使用equals()方法。

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

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

最好将int s视为数字本身,将Integer视为带有写在其上的数字的便利贴。 ==只会在您正在讨论相同的便利贴时返回true,equals()但对于任何两个带有相同编号的笔记,它都会返回true。

问题的复杂性在于,由于1.5版Java也有autoboxing,即int s会在需要时自动转换为Integer,反之亦然。如果你不小心,这会导致非常令人惊讶的结果。

答案 2 :(得分:1)

n1 == n2比较对象实例,因此n1 == n2将返回falsen1 != n2将返回true为{{ 1}}和n1 不是同一个对象实例。

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

== or !=

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

答案 3 :(得分:1)

我相信这是因为你没有比较你正在比较对象参考的n1和n2的值。由于它们是两个不同的对象,它们的引用并不相同。

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

答案 4 :(得分:1)

java.Lang.Integer是java中的object。你应该检查两个Integer对象是否等于使用equals()方法

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

              Integer n1 = New Integer(47);
              Integer n2 = New Integer(47);
              System.out.println(n1.equals(n2));
              System.out.println(n1.equals(n2));