为什么我们必须在Java中重写equals()方法?

2022-09-02 11:09:55

我对我们覆盖该方法的原因有些困惑。.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()


答案 1

从文章覆盖等于和哈希代码在Java中

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

Java建议覆盖等于和hashCode方法,如果平等将通过逻辑方式或通过一些业务逻辑定义:例如:

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

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


答案 2

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

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

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

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


推荐