1. 程式人生 > >重寫equals()時為什麼要重寫hashCode()

重寫equals()時為什麼要重寫hashCode()

重寫hashCode()時最重要的原因就是:無論何時,對同一個物件呼叫hashCode()都應該生成同樣的值。如果在將一個物件用put()方法新增進HashMap時產生一個hashCode()值,而用get()取出時卻產生了另外一個 hashCode()值,那麼就無法重新取得該物件了。所以,如果你的hashCode()方法依賴於物件中易變的資料,那使用者就要小心了,因為此資料發生變化時,hashCode()就會產生一個不同的hash碼,相當於產生了一個不同的“鍵”。
Object的hashCode()方法,返回的是當前物件的記憶體地址。下次如果我們需要取一個一樣的“鍵”對應的鍵值對的時候,我們就無法得到一樣的hashCode值了。因為我們後來建立的“鍵”物件已經不是存入HashMap中的那個記憶體地址的物件了。

1、 為什麼要過載equal方法?

答案:因為Object的equal方法預設是兩個物件的引用的比較,意思就是指向同一記憶體,地址則相等,否則不相等;
如果你現在需要利用物件裡面的值來判斷是否相等,則過載equal方法。

2、 為什麼過載hashCode方法?

答案:一般的地方不需要過載hashCode,只有當類需要放在HashTable、HashMap、HashSet等等hash結構的集合時才會 過載hashCode,那麼為什麼要過載hashCode呢?就HashMap來說,好比HashMap就是一個大記憶體塊,裡面有很多小記憶體塊,小記憶體塊 裡面是一系列的物件,可以利用hashCode來查詢小記憶體塊hashCode%size(小記憶體塊數量),所以當equal相等時,hashCode必 須相等,而且如果是object物件,必須過載hashCode和equal方法。`

3、 為什麼equals()相等,hashCode就一定要相等,而hashCode相等,卻不要求equals相等?

答案:

1、因為是按照hashCode來訪問小記憶體塊,所以hashCode必須相等。
2、HashMap獲取一個物件是比較key的hashCode相等和equal為true。

之所以hashCode相等,卻可以equal不等,就比如ObjectA和ObjectB他們都有屬性name,那麼hashCode都以name計算,所以hashCode一樣,但是兩個物件屬於不同型別,所以equal為false。

4、 為什麼需要hashCode?

答案:1、 通過hashCode可以很快的查到小記憶體塊。
2、 通過hashCode比較比equal方法快,當get時先比較hashCode,如果hashCode不同,直接返回false。