只是爲了維護 hashCode 方法的常規協定,纔要求用equals比較的兩個對象的hashCode相同.
equals()和hashCode()都來自java.lang.Object.你當然可以重寫.
比如a.equals(b).僅當a的內存地址相等時,才返回true.當然如String等類已經對這個方法進行了重寫,比較的就不再是內存地址了.
hashCode()的值也是與內存地址相關的.所以僅當內存地址相等時,hashCode才相等.同樣很多類也重寫了這個方法,還是以String爲例:
public int hashCode() {
int h = hash;
if (h == 0) {
int off = offset;
char val[] = value;
int len = count;
for (int i = 0; i < len; i++) {
h = 31*h + val[off++];
}
hash = h;
}
return h;
}
就不在與內存地址相關了.這樣做是爲了保證用equals比較返回爲true的兩個對象,他們的hashCode是相同的.
所以一般重寫equals的時候都會重寫hashCode().
當然,這個相當於一個約定,一個協議.你不這麼做並不會錯.