equals方法實現了等價關係,一般要滿足下列條件
自反性(reflexive)
對稱性(symmetric)
傳遞性(transitive)
一致性(consistent)
對於任意的非Null 參考值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方法