[英]Why do we have to override the equals() method in Java?
我对我们覆盖.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()
方法。
从文章Override equals and hashCode in Java :
java.lang.Object 提供的equals() 类的默认实现比较内存位置,只有当两个引用变量指向相同的内存位置时才返回true,即它们本质上是同一个对象。
如果相等性将通过逻辑方式或通过某些业务逻辑定义, Java 建议覆盖 equals和 hashCode 方法:例如:
Java 标准库中的许多类确实覆盖了它,例如 String 覆盖 equals,如果两个 String 对象的内容完全相同,则其 equals() 方法的实现返回 true
整数包装类覆盖等于执行数值比较等。
这应该足以回答您的问题: http : //docs.oracle.com/javase/tutorial/java/IandI/objectclass.html
equals()
方法比较两个对象是否相等,如果相等则返回true
。Object
类中提供的equals()
方法使用恒等运算符 (==
) 来确定两个对象是否相等。 对于原始数据类型,这给出了正确的结果。 但是,对于对象,则不然。Object
提供的equals()
方法测试对象引用是否相等——即比较的对象是否是完全相同的对象。要测试两个对象在等价意义上是否相等(包含相同的信息),您必须覆盖
equals()
方法。
(部分引用 - 点击阅读示例。)
.equals()不会对大多数类执行智能比较,除非类覆盖它。 如果它不是为(用户)类定义的,它的行为与 == 相同。
参考:
http
:
//www.leepoint.net/notes-java/data/expressions/22compareobjects.html
http://www.leepoint.net/data/expressions/22compareobjects.html
java.lang.Object 的默认行为是比较引用,但这并不适用于所有类型的对象。 有些东西称为值对象(如 BigDecimal 或 String),其中具有相同值的对象被认为是可互换的,因此 equals 的默认行为是不可取的。 这些类型的对象必须根据对象所采用的值来实现 equals 和 hashcode。
要回答您的问题,首先我强烈建议您查看文档。
如果不覆盖 equals() 方法,它将像“==”一样工作。 当您在对象上使用“==”运算符时,它只是检查这些指针是否指向同一个对象。 如果他们的成员包含相同的值,则不会。
我们重写以保持我们的代码干净,并将比较逻辑从 If 语句抽象到对象中。 这被认为是很好的做法,并利用了 Java 的大量面向对象的方法。
让我给你举一个我觉得很有帮助的例子。
您可以将参考视为一本书的页码。 假设现在你有两个页面 a 和 b,如下所示。
BookPage a = getSecondPage();
书页 b = getThirdPage();
在这种情况下, a == b 会给你错误。 但为什么? 原因是 == 所做的就像是比较页码。 因此,即使这两个页面上的内容完全相同,您仍然会得到错误。
但是,如果您要比较内容,我们该怎么办?
答案是编写您自己的 equals 方法并指定您真正想要比较的内容。
默认情况下 .equals() 使用 == identity 函数进行比较,这显然不起作用,因为实例 test1 和 test2 不相同。 == 仅适用于原始数据类型,如 int 或 string。 所以你需要通过比较Test类的所有成员变量来覆盖它以使其工作
Object.equals() 方法只检查对象的引用,而不是原始数据类型或对象值(原始数据的包装类对象,简单原始数据类型(byte、short、int、long 等))。 所以当我们根据原始数据类型比较对象时,我们必须覆盖 equals() 方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.