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; } }