繁体   English   中英

为什么我们必须覆盖 Java 中的 equals() 方法?

[英]Why do we have to override the equals() method in Java?

我对我们覆盖.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()方法。

从文章Override equals and hashCode in Java

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

BookPage a = getSecondPage();

书页 b = getThirdPage();

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

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

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

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

Object.equals() 方法只检查对象的引用,而不是原始数据类型或对象值(原始数据的包装类对象,简单原始数据类型(byte、short、int、long 等))。 所以当我们根据原始数据类型比较对象时,我们必须覆盖 equals() 方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM