自反性:对于任何非null的引用对象x,x.equal(x)必须返回true
对称性:对于任何非null的引用对象x、y,若x.equal(y)返回true,则y.equal(x)也必须返回true
传递性:对于任何非null的引用对象x、y、z,若x.equal(y)返回true,y.equal(z)返回true,则x.equal(z)返回true
一致性:对于任何非null的引用对象x、y,若x.equal(y)为true,在x、y都没有被修改过的情况下,无论调用多少次equal,都应该返回true
非null:对于任何非null的引用对象x,x.equal(null)都应该返回false
高质量equal要点:
1.使用==判断传入的参数是否为这个对象的引用
2.使用instanceof判断参数类型是否一致
3.对参数进行强转,因为已经进行过instanceof判断,所以强转一定会成功
4.检查类中定义的每个重要的字段,建议以一下方式对每个字段进行比较:
a.除float和double的基本类型,使用==进行比较
b.引用对象,递归调用equals方法
c.float字段调用静态方法Float.compare(float,float)进行比较。非静态方法equal有相同的结果,但是会自动装箱导致性能损耗
d.double字段调用静态方法Double.compare(double,double)进行比较。非静态方法equal有相同的结果,但是会自动装箱导致性能损耗
e.数组字段的比较,对数组中的每个element进行比较,可以调用Arrays.equal方法进行比较。