8.覆盖equals时遵守约定
equals方法实现了等价关系。
自反性:对于非null的引用值x,x.equals(x)必须返回True
对称性:对于任何非null的引用值x和y,当x.equals(y)返回True时,y.equals(x)必须返回True
两个不同类的对象,equals()方法不同时,可能违反对称性
(包括子类和父类)
传递性:对于非null的引用值x,y,z,x.equals(y)返回True,y.equals(z)返回True,x.equals(z)必须返回True
一致性:对于任何非null的引用值x和y,只要操作对象没有被修改,多次调用x.equals(y)返回值应该相同。
非空性:对于任何非null的引用值x,x.equals(null)必须返回false
实现高质量的equals:
-
使用==操作符检查“参数是否为这个对象的引用"
-
使用instanseof操作符检查“参数是否为正确的类型”
-
把参数转换成正确的类型
-
对于该类的每个关键(significant)域,检查参数中的域是否与该对象中对应的域相匹配。
-
对于不是double或float的基本类型,可以使用==操作符进行比较。
-
对于对象引用域,可以递归的使用equals()方法比较。
-
对于double或float基本类型,使用Double.compare和Float.compare比较。(因为Float.NaN,-0.0f以及类似的常量)
-
对于数组域,则要把以上这些指导原则应用到每一个元素上。(或使用Arrays.equals()方法)
-
覆盖equals方法时总要覆盖hasCode
-
equals 方法不要过于智能(复杂)
-
重写Object类中的equals方法,参数必须为Object类型,不要写错成其他类型