2008年10月12日 星期日

Override equals(), override hashCode()

這項規則可以參考 java.lang.Object 的規格書

1. 在同一個應用程式執行期間, 對同一個物件呼叫 hashCode(), 必須回傳相同的整數結果
2. 如果兩個物件被 equals(Object) 視為相等, 則這兩個物件呼叫 hashCode() 必須獲得相同的整數結果
3. 如果兩個物件被 equals(Object) 視為不相等, 則這兩個物件呼叫 hashCode() 不必獲得相同的整數結果

若要方便產生這些原始碼,也可以參閱 commons.lang.builder
org.apache.commons.lang.builder

另外我們可以研究一下 java.lang.Object, java.lang.String 底下的原始碼
java.lang.Object

public boolean equals(Object obj) {
return (this == obj);
}
java.lang.String
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = count;
if (n == anotherString.count) {
char v1[] = value;
char v2[] = anotherString.value;
int i = offset;
int j = anotherString.offset;
while (n-- != 0) {
if (v1[i++] != v2[j++])
return false;
}
return true;
}
}
return false;
}
很明顯的,equals()在比較是否 reference 到同一個記憶體位置,若為 String 物件,則比對物件的內容。

0 意見: