覆盖equals时请遵守通用约定
equals方法实现了等价关系
- 自反性:对于任何非null的引用值x,x.equals(x)必须返回true
- 对称性:对于任何非null的引用值x和y,当且仅当y.equals(x)返回true时,x.equals(y)必须返回true
- 传递性:对于任何非null的引用值x、y和z,如果x.equals(y)返回true,y.equals(z)也返回true,那么x.equals(z)也必须返回true
- 一致性:对于任何非null的引用值x和y,只要equals的比较操作在对象中所用的信息没有被修改,多次调用equals返回的结果也一致
- 非空性:对于任何非null的引用值x,x.equals(null)必须返回false
实现高质量equals方法的诀窍
- 使用==操作符检查“参数是否为这个对象的引用”
- 使用instanceof操作符检查“参数是否为正确的类型”
- 把参数转换成正确的类型
- 对于该类中的每个“关键”域,检查参数中的域是否与该对象中对应的域相匹配
- 当编写完成了equals,要确认三要素:对称性、传递性、一致性
- 覆盖equals时总是要覆盖hashCode
- 不要企图让equals方法过于智能
- 不要将equals声明中的Object对象替换为其他的类型
覆盖equals时总是要覆盖hashCode
在每个覆盖了equals方法的类中,也必须覆盖hashCode方法
相等的对象必须具有相等的散列码
网友评论