1.1 equals方法
覆盖equals方法必须遵守的约定:
1、自反性
x.equals(x)必须返回true
2、对称性
x.equals(y)的结果与y.equals(x)必须一致
3、传递性
x.equals(y)为true且y.equals(z)为true,则x.equals(z)为true
4、一致性
多次调用equals方法,结果必须一致
5、对于任何非null的引用x,x.equals(null)必须返回false
综合以上五个约定,得出了实现高质量equals方法的诀窍:
1、使用==操作符检查是否为这个对象的引用
2、使用instanceof操作符检查“参数是否为正确的类型”
3、把参数转化成正确的类型
4、对于该类中每个关键域,检查参数中的域是否与该对象中对应的域想匹配
5、当编写完equals方法后,测试一下五个约定是否都遵守了
注意点:
1、覆盖equals时总是要覆盖hashCode方法
2、不要企图让equals方法过于智能
3.不要讲equals方法中的Object对象替换为其他的类型,这样其实没有覆盖Object.equals,使用@Override注解可以避免这种问题
一个标准的equals方法的例子:(判断一个手机号是否相等)
public class PhoneNumber {
private final short areaCode;
private final short prefix;
private final short lineNumber;
public PhoneNumber(short areaCode, short prefix, short lineNumber) {
this.areaCode = areaCode;
this.prefix = prefix;
this.lineNumber = lineNumber;
}
@Override
public boolean equals(Object o) {
if(o == this) {
return true;
}
if(!(o instanceof PhoneNumber)) {
return false;
}
PhoneNumber number = (PhoneNumber)o;
return number.lineNumber == lineNumber &&
number.prefix == prefix &&
number.areaCode == areaCode;
}
}