为什么我们必须重写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()
方法比较两个对象是否相等,如果相等则返回true
。Object
类中提供的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()方法。