Object類中的equals方法用於檢測一個對象是否等於另外一個對象。在Object類中,這個方法將判斷兩個對象是否具有相同的引用。如果兩個對象具有相同的引用,它們一定是相等的。從這點上看,將其作為默認操作也是合乎情理的。然而,對於多數類來說,這種判斷並沒有什么意義。例如,采用這種方法比較兩個PrintStream對象是否相等就完全沒有意義。然而,經常需要檢測兩個對象狀態的相等性,如果兩個對象的狀態相等,就認為這兩個對象是相等的。
下面采用以下示例演示equals方法的實現機制:
public class Employee{ ... public boolean equals(Object otherObject){ //快速檢查對象是否相同 if(this==otherObject) return true; //如果EcPLID參數為空,則必須返回false if(otherObject==null) return false; //如果類不匹配,它們就不能相等。 if(getClass()!=otherObject.getClass()) return false; //現在我們知道另一個對象是非空雇員 Employee other =(Employee)otherObject; //測試字段是否具有相同的值 return Object.equals(other.name); && salary==other.salary && hireDay.equals(other.hireDay); } }
getClass方法將返回一個對象所屬的類,有關這個方法的詳細內容稍后進行介紹。在檢測中,只有在兩個對象屬於同一個類時,才有可能相等。
提示:為了防備name或hireDay可能為null的情況,需要使用Object.equals方法。如果兩個參數都為null,Object.equals(a,b)調用將返回true;如果其中一個參數為null,則返回false;否則,如果兩個參數都不為null,則調用a.equals(b)。利用這個方法,Employee的方法equals的最后一條語句要改寫為:
return name.equals(name,other.name); && salary==other.salary && Object.equals(hireDay,other.hireDay);
Java語言規范要求equals方法具有下面的特性:
1) 自反性:對於任何非空引用x,x.equals(x)應該返回true。
2) 對稱性:對於任何引用x和y,當且僅當y.equals(x)返回true,x.equals(y)也應該返回true。
3) 傳遞性:對於任何引用x,y和z,如果x.equals(y)返回true,y.equals(z)返回true,x.equals(z)也應該返回true。
4) 一致性:如果x和y引用的對象沒有發生變化,反復調用x.equals(y)應該返回同樣的結果。
5) 對於任何非空引用x,x.equals(null)應該返回false。
