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

我对我们重写.equals方法的原因有一些困惑。

例如:

 Test test1 = new Test(3); Test test2 = new Test(3); // The if comparison statement do same thing // which the overridden `.equals()` method does. if(test1.equals(test2)){ System.out.println("test1 and test2 are ture in .equal"); } // 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和Java中的hashCode

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

Javabuild议覆盖equals和hashCode方法,如果将通过逻辑方式或通过某些业务逻辑来定义相等性:例如:

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

整数包装类覆盖等于执行数字比较等

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

equals()方法比较两个对象是否相等,如果相等则返回trueObject类中提供的equals()方法使用identity操作符( == )来确定两个对象是否相等。 对于原始数据types,这给出了正确的结果。 然而,对于对象来说,事实并非如此。 Object提供的equals()方法testing对象引用是否相等 – 也就是说,比较的对象是完全相同的对象。

为了testing两个对象在等价意义上是否相等 (包含相同的信息),您必须重写equals()方法。

(部分引用 – 点击即可阅读示例。)

除非类覆盖它,否则.equals()不会执行大多数类的智能比较。 如果它没有为(用户)类定义,则它的行为与==相同。

参考: http : //www.leepoint.net/notes-java/data/expressions/22compareobjects.html http://www.leepoint.net/data/expressions/22compareobjects.html

java.lang.Object的默认行为是比较引用,但这不适用于每种types的对象。 有些东西叫值对象 (如BigDecimal或String),其中具有相同值的对象被认为是可以互换的,所以equals的默认行为是不可取的。 这些types的对象必须根据对象的值来实现equals和hashcode。

要回答你的问题,首先我强烈build议查看文档 。

不重写equals()方法,它会像“==”一样行事。 当你在对象上使用“==”运算符时,它只是检查这些指针是否指向同一个对象。 不是如果他们的成员包含相同的价值。

我们覆盖保持我们的代码清洁,并从If语句抽象比较逻辑到对象中。 这被认为是良好的做法,并利用了Java的面向对象的方法。

让我给你一个我觉得很有帮助的例子。

您可以将参考视为一本书的页码。 现在假设你有两个页面a和b,如下所示。

BookPage a = getSecondPage();

BookPage b = getThirdPage();

在这种情况下,a == b会给你错误的。 但为什么? 原因是什么==正在做的就像比较页码。 所以,即使这两页上的内容完全一样,你仍然会得到错误的结果。

但是,如果我们要比较内容,我们该怎么办?

答案是写你自己的等号方法,并指定你真正想要比较的东西。

默认情况下,.equals()使用==标识函数来比较哪个显然不工作,因为实例test1和test2是不一样的。 ==只适用于像int或string这样的原始数据types。 所以你需要重写它,通过比较Test类的所有成员variables来使其工作

Object.equals()方法只检查对象的引用,而不是原始数据types或对象值(原始数据的包装类对象,简单原始数据types(字节,短,整数,长等))。 所以当我们比较基于原始数据types的对象时,我们必须重写equals()方法。