equals方法实现了等价关系,一般要满足下列条件
自反性(reflexive)
对称性(symmetric)
传递性(transitive)
一致性(consistent)
对于任意的非空引用值x,x.equals(null)一定返回false.
要实现高质量equals方法,可如下做:
使用==操作符检查“实参是否为指向对象的一个引用” ,如果是,返回true;
使用instanceof操作符检查“实参是否为正确的类型”,
如果不是,返回false;
把实参转换到正确的类型
对于该类中每一个"关键(significant)"域,检查实参中的域与当前对象中对应的域值是否匹配。
如果所有的测试都成功,则返回true;
例如:
class Programer{
int number;
public Programer(int n){
number=n;
}
//必须覆盖hashCode()方法
public int hashCode(){
return number;
}
public boolean equals(Object obj){
if(this==obj)) return true;//比较的是两个对象的引用(references)是否相等
if(obj==null) return false;//检查 obj)是否为空
if(!(obj instanceof(Programer))) return false;
return (number==((Programer)obj).number);
}
}
当编写完成了equals方法之后,应该满足:它是否是对称的、传递的、一致的?
注意:
1)当你改写equals的时候,总是要改写hasCode方法
2)不要将equals声明中的Object对象替换为其它的类型
当你的equals不能正常工作时,看看是不是犯了下述例子的错误。
public boolean equals(MyClass o){
...
}
这种方式并不是覆盖object类的equals方法