public boolean equals(Object o) {
if (o == this) //1.使用==操作符检查“参数是否为这个对象的引用”
return true;
if (!(o instanceof List))//2.使用instanceof操作符检查“参数是否为正确的类型”
return false;
ListIterator<E> e1 = listIterator();
ListIterator e2 = ((List) o).listIterator();//3.把参数转换成正确的类型
while(e1.hasNext() && e2.hasNext()) {
E o1 = e1.next();
Object o2 = e2.next();
if (!(o1==null ? o2==null : o1.equals(o2)))//4.对于该类中的每个“关键(significant)”域,检查参数中的域是否与该对象中的对应域相匹配
return false;
}
return !(e1.hasNext() || e2.hasNext());
}
上面的实例代码是AbstactList的equals方法。
《Effective Java》提出的equals方法的通用约定
·自反性:对于任何非null的引用值x,x.equals(x)必须返回true。
·对称性:对于任何非null的引用值x和y,当且仅当y.equals(x)返回true时,x.equals(y)返回true。
·传递性:对于任何非null的引用值x、y和z,当且仅当y.equals(x)返回true,并且y.equals(z)返回true时,x.equals(z)返回true
·一致性:对于任何非null的引用值x和y,只要equals的比较操作在对象中所用的信息没有被修改,多次调用x.equals(y)就会一致地返回true,或者一致地返回false
·对于任何非null的引用值x,x.equals(null)必须返回false
实现高质量equals方法的诀窍
1.使用==操作符检查“参数是否为这个对象的引用”
2.使用instanceof操作符检查“参数是否为正确的类型”
3.把参数转换成正确的类型
4.对于该类中的每个“关键(significant)”域,检查参数中的域是否与该对象中的对应域相匹配
5.编写完equals方法后,应该问自己三个问题:它是否是对称的、传递的、一致的