19

我对我们重写该.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()方法。

4

8 回答 8

45

从文章Override equals and hashCode in Java

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

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

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

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

于 2013-03-02T13:53:25.337 回答
20

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

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

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

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

于 2013-03-02T13:49:52.577 回答
6

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

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

于 2013-09-26T07:43:04.807 回答
3

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

于 2013-03-02T15:07:04.087 回答
2

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

于 2014-07-24T01:43:30.367 回答
2

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

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

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

于 2013-03-02T13:53:11.750 回答
2

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

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

BookPage a = getSecondPage();

BookPage b = getThirdPage();

在这种情况下, a == b 会给你错误。但为什么?原因是 == 所做的就像比较页码一样。因此,即使这两个页面上的内容完全相同,您仍然会得到错误。

但是,如果您要比较内容,该怎么办?

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

于 2014-06-02T20:56:11.207 回答
1

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

于 2014-01-12T15:34:55.040 回答