【问题标题】:Why do we have to override the equals() method in Java?为什么我们必须重写 Java 中的 equals() 方法?
【发布时间】:2018-04-12 02:14:46
【问题描述】:

我对我们重写 .equals 方法的原因有些困惑。

例如:

Test test1 = new Test(3);
Test test2 = new Test(3);

//The if comparison does the same thing that the overridden `.equals()` method does.
if(test1.equals(test2)){
    System.out.println("test1 and test2 are true in .equals()");
}

// Override .equals method.
public boolean equals(Object object) {
    if(object instanceof Test && ((Test)object).getValue() == this.t) {
        return true;
    } else {
        return false;
    }
}

我不明白为什么我们必须重写 .equals() 方法。

【问题讨论】:

  • test1.equals(test2) 如果不覆盖它,将无法按预期工作。
  • 注意:如果要覆盖equals(),则必须覆盖hashCode()

标签: java overriding equals


【解决方案1】:

来自Override equals and hashCode in Java的文章:

默认实现由 java.lang.Object 提供的 equals() 类 比较内存位置,并且只有在两个引用变量指向相同的内存位置时返回 true,即本质上他们是同一个对象。

如果相等要通过逻辑方式或某些业务逻辑定义,Java 建议覆盖 equals 和 hashCode 方法:示例:

Java 标准库中的许多类确实会覆盖它,例如字符串覆盖equals,如果两个String对象的内容完全相同,equals()方法的实现返回true

整数包装类覆盖等于执行数值比较等。

【讨论】:

    【解决方案2】:

    这应该足以回答您的问题: http://docs.oracle.com/javase/tutorial/java/IandI/objectclass.html

    equals() 方法比较两个对象是否相等,如果相等则返回 trueObject 类中提供的equals() 方法使用恒等运算符(==)来判断两个对象是否相等。对于原始数据类型,这会给出正确的结果。然而,对于对象,它不是。 Object 提供的 equals() 方法测试对象 references 是否相等,即比较的对象是否完全相同。

    要测试两个对象在等价性意义上是否相等(包含相同的信息),您必须重写equals() 方法。

    (部分引用 - 点击阅读示例。)

    【讨论】:

    • Object 类中提供的equals() 方法使用恒等运算符(==)来判断两个对象是否相等。对于原始数据类型,这会给出正确的结果。然而,对于对象,它没有。这意味着,如果我们发现不需要 override equals() 方法,我们最好选择 ==。我说的对吗?
    【解决方案3】:

    .equals() 不会对大多数类执行智能比较,除非该类覆盖它。如果它没有为(用户)类定义,它的行为与 == 相同。

    参考:http://www.leepoint.net/notes-java/data/expressions/22compareobjects.htmlhttp://www.leepoint.net/data/expressions/22compareobjects.html

    【讨论】:

      【解决方案4】:

      java.lang.Object 的默认行为是比较引用,但这并不适用于所有类型的对象。有些东西称为Value Objects(如BigDecimal 或String),其中具有相同值的对象被认为是可互换的,因此不希望使用equals 的默认行为。这些类型的对象必须根据对象的值实现equals和hashcode。

      【讨论】:

        【解决方案5】:

        要回答您的问题,首先我强烈建议您查看Documentation

        如果不覆盖 equals() 方法,它的行为就像“==”。当您在对象上使用“==”运算符时,它只是检查这些指针是否指向同一个对象。如果它们的成员包含相同的值,则不会。

        我们重写以保持我们的代码干净,并将比较逻辑从 If 语句抽象到对象中。这被认为是一种很好的做法,并利用了 Java 高度面向对象的方法。

        【讨论】:

          【解决方案6】:

          让我举一个我觉得很有帮助的例子。

          您可以将参考视为一本书的页码。 假设现在您有两个页面 a 和 b,如下所示。

          书页 a = getSecondPage();

          书页 b = getThirdPage();

          在这种情况下,a == b 会给你错误。但为什么?原因是 == 所做的就像比较页码一样。所以,即使这两个页面的内容完全一样,你还是会误报。

          但是如果我们要比较内容怎么办?

          答案是编写你自己的 equals 方法并指定你真正想要比较的内容。

          【讨论】:

            【解决方案7】:

            默认情况下 .equals() 使用 == 标识函数来比较哪个显然不起作用,因为实例 test1 和 test2 不一样。 == 仅适用于原始数据类型,如 int 或 string。所以你需要通过比较Test类的所有成员变量来覆盖它以使其工作

            【讨论】:

            • 在创建类并将进行比较时重写 equals 方法被认为是一种很好的做法。
            【解决方案8】:

            Object.equals() 方法只检查对象的引用而不是原始数据类型或对象值(原始数据的包装类对象,简单的原始数据类型(字节、短、整数、长等))。所以当我们根据原始数据类型比较对象时,我们必须重写equals()方法。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2021-12-12
              • 2014-08-06
              • 1970-01-01
              • 1970-01-01
              • 2013-06-26
              • 2022-06-15
              • 2012-01-26
              相关资源
              最近更新 更多