8: 覆盖 equals 时请遵守通用规定
1.覆盖 equals 后,需要满足的条件
- 1.类的每个实例本质上都是唯一的
- 2.不关心是否提供了“逻辑相等”的测试功能
- 3.超类已经覆盖了 equals,从超类继承过来d额行为对于子类也是合适的
- 4.类是私有的或者包私有的,可以确定它的 equals 方法永远不会被调用
2.覆盖 equals 方法时要遵守的几个约定
- 1.自反性 - 对于任何非 null 的引用值 x,x.euqals(x) 必须返回 true, 
- 2.对称性 - 对于任何非 null 的引用值 x 和 y,当且仅当 y.equals(x) 返回 true 时,x.equals(y) 必须返回 true。 
- 3.传递性 - 对于任何非 null 的引用值 x、y 和 z,如果 x.equals(y) 返回 true,y.equals(z) 也返回 true, 那么 x.equals(z) 也必须返回 true。 
- 4.一致性 - 对于任何非 null 的引用值 x 和 y,只要 equals 的比较操作在对象中多有的信息都没有被修改,多次调用 x.equals(y) 就会一致的返回 true 或者 false。 
- 5.非空性 - 所有的对象都不能为 null,为了防止抛出空指针异常。 
3.高效实现 equals 方法的诀窍
- 1.使用 == 操作符检查“参数是否为这个对象的引用” 
- 2.使用 instanceof 操作符检查“参数是否为正确的类型“ 
- 3.把参数转换为正确的类型(接2) 
- 4.对于该类中的每个”关键“域,检查参数中的域是否与该对象中对应的域相匹配 
- 5.编写完之后,检查是否是对称的,传递的,一致的 
- 6.覆盖 equals 时,总要覆盖 hashcode 
- 7.不要企图让 equals 方法过于智能 
- 8.不要将 equals 声明中的 Object 对象替换为其他的类型