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

eqfvzcg8  于 2021-06-30  发布在  Java
关注(0)|答案(8)|浏览(396)

我不太明白我们为什么要推翻 .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() 方法。

y3bcpkx1

y3bcpkx11#

在java中的override equals和hashcode一文中:
java.lang.object提供的equals()类的默认实现比较内存位置,并且仅当两个引用变量指向相同的内存位置(即本质上它们是相同的对象)时才返回true。
如果要通过逻辑方式或某些业务逻辑来定义相等,java建议重写equals和hashcode方法:示例:
java标准库中的许多类都会重写它,例如string重写equals,如果两个string对象的内容完全相同,那么equals()方法的实现将返回true
整数 Package 类重写等于执行数值比较等。

bmp9r5qi

bmp9r5qi2#

我给你举一个我觉得很有帮助的例子。
你可以把参考文献看作是一本书的页码。假设现在你有两页a和b,如下面所示。
bookpage a=getsecondpage();
bookpage b=getthirdpage();
在这种情况下,a==b将给出false。但是,为什么?原因是==所做的就像比较页码。因此,即使这两个页面上的内容完全相同,您仍然会得到false。
但是如果你想比较一下内容,我们该怎么办?
答案是编写您自己的equals方法并指定您真正想要比较的内容。

dwthyt8l

dwthyt8l3#

.equals()不会对大多数类执行智能比较,除非类重写它。如果它不是为(用户)类定义的,则其行为与==。
参考文献:http://www.leepoint.net/notes-java/data/expressions/22compareobjects.htmlhttp://www.leepoint.net/data/expressions/22compareobjects.html

oyt4ldly

oyt4ldly4#

java.lang.object的默认行为是比较引用,但这并不适用于所有类型的对象。有一些东西叫做值对象(比如bigdecimal或string),其中具有相同值的对象被认为是可互换的,因此equals的默认行为是不可取的。这些类型的对象必须基于对象的值实现equals和hashcode。

20jt8wwn

20jt8wwn5#

默认情况下,equals()使用==identity函数进行比较,这显然不起作用,因为test1和test2的示例不一样仅适用于int或string等基本数据类型。所以您需要重写它,通过比较测试类的所有成员变量使其工作

f4t66c6m

f4t66c6m6#

方法只检查对象的引用,而不检查基元数据类型或对象值(基元数据的 Package 类对象、简单基元数据类型(byte、short、int、long等))。因此,在基于基元数据类型比较对象时,必须重写equals()方法。

o75abkj4

o75abkj47#

这足以回答您的问题:http://docs.oracle.com/javase/tutorial/java/iandi/objectclass.html
这个 equals() 方法比较两个对象的相等性和返回 true 如果他们相等。这个 equals() 中提供的方法 Object 类使用标识运算符( == )判断两个物体是否相等。对于原始数据类型,这将给出正确的结果。但是,对于对象,它不是。这个 equals() 方法由提供 Object 测试对象引用是否相等,也就是说,如果比较的对象是完全相同的对象。
要测试两个对象在等价意义上是否相等(包含相同的信息),必须重写 equals() 方法。
(部分引用-点击阅读示例。)

kmpatx3s

kmpatx3s8#

要回答您的问题,首先我强烈建议您查看文档。
如果不重写equals()方法,它的行为将类似于“==”。在对象上使用“==”运算符时,它只检查这些指针是否引用同一对象。如果它们的成员包含相同的值,则不会。
我们重写以保持代码干净,并将比较逻辑从if语句抽象到对象中。这被认为是很好的实践,并利用了java的高度面向对象的方法。

相关问题