续重写equals()方法
- 在覆盖equals方法的时候,我们必须遵守以下通用约定。(来自Object的规范[JavaSE6]):
- 反射性:x.equals(x)必须返回是"true"。
- 对称性:如果x.equals(y)返回是"true",那么y.equals(x)也应该返回是"true"。
- 传递性:如果x.equals(y)返回是"true",而且y.equals(z)返回是"true",那么z.equals(x)也应该返回是"true"。
- 一致性:如果x.equals(y)返回是"true",只要x和y内容一直不变,不管你重复x.equals(y)多少次,返回都是"true"。
- 非空性:任何情况下,x.equals(null),永远返回是"false";x.equals(和x不同类型的对象)永远返回是"false"。
这些规则能帮助我们实现准确的equals方法。如果我们违反了它们,那么我们的程序就会失去准确性,而且难于调试。没有哪个类是孤立的,一个类的实例通常会被频繁地传递给另一个类的实例。有许多类,包括所有的集合类在内,都依赖于传递给它们的对象是否遵守了equals约定。例如:Java中的集合类有两类:一类是List,一类是Set。前者允许集合内的元素可 以重复,后者则不允许集合中的元素可以重复。那么Java是如何判断集合中的元素是否重复呢?是通过对象中的equals()方法进行比较。因此 equals()的准确性及其重要。接下来的内容摘抄自《Effective Java》。
实现高质量equals方法的诀窍:
- 使用==操作符检查"参数是否为这个对象的引用"。
- 使用instanceof操作符检查"参数是否为正确的类型"。
- 把参数转换成正确的类型。
- 对于该类中的"关键"域,检查参数中的域是否与该对象中对应的域相匹配。
- 当你编写完成了equals方法之后,应该问自己三个问题:它是否对称的、传递的、一致的?
作者给出的告诫:
- 覆盖equals时总要覆盖hashCode。
- 不要企图让equals方法过于智能。
- 不要将equals声明中的Object对象替换为其他的类型。
- 重写了equals方法,别忘了也要冲洗hashCode哦。请看另一篇博客,重写hashCode()方法。http://www.cnblogs.com/free9277/archive/2013/03/12/2956368.html