所有对象通用的方法
Object对象的所有非final方法(equals、hashCode、toString、clone和finalize)都有明确的通用约定( general contracts )。任何覆盖了了这些方法的类都有责任遵循这些约定,否则其它依赖于这些约定的类(例如HashMap和HashSet)就无法与之正常工作。
覆盖equals时应遵循的通用约定
覆盖equals方法看似很简单,但是有很多坑,并且后果很严重。避免出错的最简单方法就是不覆盖equals方法(–!),这时每个对象仅仅equals它自己。
这种做法只有在以下情况中适用:
- 类的每个实例实质上都是唯一的
- 不关心类是否提供了逻辑相等的功能
- 父类已经覆盖了equals方法,并且行为适用于子类
- 类是私有或者包私有,并且可以确定equals方法永远不会被调用
如果需要实现逻辑相等,那么覆盖equals方法需要满足以下约定:
- 自反性(Reflexive):对于任何非null的引用值x,x.euqals(x)必须返回true
- 对称性(Symmetric)
- 传递性(Transitive)
- 一致性(Consistent):任何非null引用值x,y,只要equals的比较操作在对象中所用的信息没有被修改,多次调用x.equals(y)就会一致地返回true或者false
- 对于任何非null的引用值x,x.equals(null)必须返回false
覆盖equals方法的同时一定要覆盖hashCode方法