一.覆盖equals时请遵守通用约定
1.可以不覆盖euqals方法的情况
覆盖equals方法看起来似乎简单,但是有许多覆盖方式会导致错误,并且后果非常严重,最容易避免这类问题的办法就是不覆盖equals方法。
如果满足一下任何一个条件,则可以不需要覆盖equals方法。
类的每一个实例都是唯一的。
不关心类是否提供了“逻辑相等”的测试功能。
父类已经覆盖类equals,从父类继承过来的行为对子类也是合适的。
类是私有的或者包级私有的,可以确定它的equals方法永远不会被调用。
枚举类也不需要覆盖equals方法,因为每一个值最多存在一个对象
2.覆盖equals方法需要遵守的约定
自反性
对于任何非空的引用值x,x.equals(x)必须返回true。
对称性
对于任何非空的引用值x和y,当且仅当y.equals(x)返回true时,x.equals(y)必须返回true。
传递性
对于任何非空的引用值x,y和z,如果x.equals(y)返回true,并且y.equals(z)也返回true,那么x.equals(z)也必须返回true。
一致性
对于任何非空的引用值x和y,只要equals的比较操作在对象中所用的信息没有被修改,则多次调用x.equals(y)返回结果一致。
非空性
对于任何非空的引用x,x.equals(null)必须返回false。