我对我们覆盖.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()
方法。
答案 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()
方法比较两个对象是否相等,如果它们相等则返回true
。equals()
类中提供的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()方法。