我不太明白我们为什么要推翻 .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条答案
按热度按时间y3bcpkx11#
在java中的override equals和hashcode一文中:
java.lang.object提供的equals()类的默认实现比较内存位置,并且仅当两个引用变量指向相同的内存位置(即本质上它们是相同的对象)时才返回true。
如果要通过逻辑方式或某些业务逻辑来定义相等,java建议重写equals和hashcode方法:示例:
java标准库中的许多类都会重写它,例如string重写equals,如果两个string对象的内容完全相同,那么equals()方法的实现将返回true
整数 Package 类重写等于执行数值比较等。
bmp9r5qi2#
我给你举一个我觉得很有帮助的例子。
你可以把参考文献看作是一本书的页码。假设现在你有两页a和b,如下面所示。
bookpage a=getsecondpage();
bookpage b=getthirdpage();
在这种情况下,a==b将给出false。但是,为什么?原因是==所做的就像比较页码。因此,即使这两个页面上的内容完全相同,您仍然会得到false。
但是如果你想比较一下内容,我们该怎么办?
答案是编写您自己的equals方法并指定您真正想要比较的内容。
dwthyt8l3#
.equals()不会对大多数类执行智能比较,除非类重写它。如果它不是为(用户)类定义的,则其行为与==。
参考文献:http://www.leepoint.net/notes-java/data/expressions/22compareobjects.htmlhttp://www.leepoint.net/data/expressions/22compareobjects.html
oyt4ldly4#
java.lang.object的默认行为是比较引用,但这并不适用于所有类型的对象。有一些东西叫做值对象(比如bigdecimal或string),其中具有相同值的对象被认为是可互换的,因此equals的默认行为是不可取的。这些类型的对象必须基于对象的值实现equals和hashcode。
20jt8wwn5#
默认情况下,equals()使用==identity函数进行比较,这显然不起作用,因为test1和test2的示例不一样仅适用于int或string等基本数据类型。所以您需要重写它,通过比较测试类的所有成员变量使其工作
f4t66c6m6#
方法只检查对象的引用,而不检查基元数据类型或对象值(基元数据的 Package 类对象、简单基元数据类型(byte、short、int、long等))。因此,在基于基元数据类型比较对象时,必须重写equals()方法。
o75abkj47#
这足以回答您的问题:http://docs.oracle.com/javase/tutorial/java/iandi/objectclass.html
这个
equals()
方法比较两个对象的相等性和返回true
如果他们相等。这个equals()
中提供的方法Object
类使用标识运算符(==
)判断两个物体是否相等。对于原始数据类型,这将给出正确的结果。但是,对于对象,它不是。这个equals()
方法由提供Object
测试对象引用是否相等,也就是说,如果比较的对象是完全相同的对象。要测试两个对象在等价意义上是否相等(包含相同的信息),必须重写
equals()
方法。(部分引用-点击阅读示例。)
kmpatx3s8#
要回答您的问题,首先我强烈建议您查看文档。
如果不重写equals()方法,它的行为将类似于“==”。在对象上使用“==”运算符时,它只检查这些指针是否引用同一对象。如果它们的成员包含相同的值,则不会。
我们重写以保持代码干净,并将比较逻辑从if语句抽象到对象中。这被认为是很好的实践,并利用了java的高度面向对象的方法。