【问题标题】:equality operator, odd results? [duplicate]相等运算符,奇怪的结果? [复制]
【发布时间】:2012-10-24 04:02:41
【问题描述】:

我对以下代码有疑问:

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

提前致谢

谢谢

【问题讨论】:

标签: java


【解决方案1】:

n1 == n2比较对象实例,因此n1 == n2 将返回falsen1 != n2 将返回true,因为n1n2不相同的对象实例。

如果您使用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

【讨论】:

  • 您好,您的回答使用了 2 个类似的语句:P,请告诉您
  • @Twocold:哪两个陈述?请检查,它的工作如前所述。
  • 第一个 n1 != n2 返回 false,但你再次遇到相同的,n1 != n2 返回 true :)
  • @Twocold:我之前更正了很多。请检查更新的答案。
  • 现在是正确的,谢谢你的明确回答。
【解决方案2】:

您应该使用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

【讨论】:

  • 谢谢,但两个值(n1 和 n2)似乎相同,为什么第一个输出的结果是 False?当我使用 System.out.println(n1.equals(n2)) 时,一切正常。
【解决方案3】:

java.Lang.Integer 是 java 中的 object。您应该使用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));

【讨论】:

  • 谢谢,我想我混淆了 int 和 Integer。感谢您指出这一点。
【解决方案4】:

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

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

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

最好将ints 视为数字本身,将Integers 视为写有数字的便利贴。 == 只会在您谈论同一个便利贴时返回 true,equals() 但是对于任何两个带有相同编号的便笺都会返回 true。

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

【讨论】:

  • 答案很清楚,谢谢!
  • 我这里还有一个问题,如果我想创建 2 个不同的对象并给它们 2 个相同的内容,String 会发生什么,但使用 s1.equals(s2) 的结果是错误的。谢谢
【解决方案5】:

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

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

【讨论】:

    猜你喜欢
    • 2023-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-23
    • 2012-08-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多