续重写Object中的equals方法

      在覆盖equals方法的时候,我们必须遵守以下通用约定。(来自Object的规范[JavaSE6]): 

      1、反射性:x.equals(x)必须返回是"true"
      2、对称性:如果x.equals(y)返回是"true",那么y.equals(x)也应该返回是"true"
      3、传递性:如果x.equals(y)返回是"true",而且y.equals(z)返回是"true",那么z.equals(x)也应该返回是"true"
      4、一致性:如果x.equals(y)返回是"true",只要x和y内容一直不变,不管你重复x.equals(y)多少次,返回都是"true"
      5、非空性:任何情况下,x.equals(null),永远返回是"false";x.equals(和x不同类型的对象)永远返回是"false"。

      这些规则能帮助我们实现准确的equals方法。如果我们违反了它们,那么我们的程序就会失去准确性,而且难于调试。 没有哪个类是孤立的,一个类的实例通常会被频繁地传递给另一个类的实例。有许多类,包括所有的集合类在内,都依赖于传递给它们的对象是否遵守了 equals约定。例如:Java中的集合类有两类:一类是List,一类是Set。前者允许集合内的元素可 以重复,后者则不允许集合中的元素可以重复。那么Java是如何判断集合中的元素是否重复呢?是通过对象中的equals()方法进行比较。因此 equals()的准确性及其重要。接下来的内容摘抄自《Effective Java》。

      实现高质量equals方法的诀窍:

      1、使用==操作符检查"参数是否为这个对象的引用"。
      2、使用instanceof操作符检查"参数是否为正确的类型"。
      3、把参数转换成正确的类型。
      4、对于该类中的"关键"域,检查参数中的域是否与该对象中对应的域相匹配。
      5、当你编写完成了equals方法之后,应该问自己三个问题:它是否对称的、传递的、一致的?

      作者给出的告诫:

      1、覆盖equals时总要覆盖hashCode。
      2、不要企图让equals方法过于智能。
      3、不要将equals声明中的Object对象替换为其他的类型。

      重写了equals方法,别忘了也要冲洗hashCode哦。请看另一篇博客,重写hashCode()方法http://free9277.iteye.com/admin/blogs/1832378

你可能感兴趣的:(java基础)