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

时间:2013-03-02 13:40:14

标签: java override equals

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

8 个答案:

答案 0 :(得分:42)

来自文章Override equals and hashCode in Java

  

java.lang.Object提供的equals()类的默认实现 比较内存位置,只有如果两个引用变量指向同一内存位置,则返回true他们是同一个对象。

     

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

     

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

     

整数包装类重写等于执行数字比较等。

答案 1 :(得分:20)

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

  

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

     

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

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

答案 2 :(得分:6)

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

相同

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

答案 3 :(得分:3)

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

答案 4 :(得分:2)

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

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

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

答案 5 :(得分:2)

让我举个例子,我觉得非常有帮助。

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

  

BookPage a = getSecondPage();

     

BookPage b = getThirdPage();

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

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

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

答案 6 :(得分:2)

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

来覆盖它以使其工作

答案 7 :(得分:1)

Object.equals()方法仅检查对象的引用而不是原始数据类型或Object值(原始数据的Wrapper类对象,简单原始数据类型(byte,short,int,long等))。因此,当我们基于原始数据类型比较对象时,我们必须覆盖equals()方法。