1. 程式人生 > >(java面試)為什麼重寫equals的時候一般要重寫hashcode

(java面試)為什麼重寫equals的時候一般要重寫hashcode

支援原創,轉載自:http://blog.csdn.net/fenglibing/article/details/8905007

hashcode是用來查詢的,如果學過資料結構就應該知道,在查詢和排序這一章有  
例如記憶體中有這樣的位置  
0  1  2  3  4  5  6  7    
而我有個類,這個類有個欄位叫ID,我要把這個類存放在以上8個位置之一,如果不用hashcode而任意存放,那麼當查詢時就需要到這八個位置裡挨個去找,或者用二分法一類的演算法。  
但如果用hashcode那就會使效率提高很多。  
我們這個類中有個欄位叫ID,那麼我們就定義我們的hashcode為ID%8,然後把我們的類存放在取得得餘數那個位置。比如我們的ID為9,9除8的餘數為1,那麼我們就把該類存在1這個位置,如果ID是13,求得的餘數是5,那麼我們就把該類放在5這個位置。這樣,以後在查詢該類時就可以通過ID除 8求餘數直接找到存放的位置了。  
  
2.但是如果兩個類有相同的hashcode怎麼辦那(我們假設上面的類的ID不是唯一的),例如9除以8和17除以8的餘數都是1,那麼這是不是合法的,回答是:可以這樣。那麼如何判斷呢?在這個時候就需要定義 equals了。  
也就是說,我們先通過 hashcode來判斷兩個類是否存放某個桶裡,但這個桶裡可能有很多類,那麼我們就需要再通過 equals 來在這個桶裡找到我們要的類。  
那麼。重寫了equals(),為什麼還要重寫hashCode()呢?  
想想,你要在一個桶裡找東西,你必須先要找到這個桶啊,你不通過重寫hashcode()來找到桶,光重寫equals()有什麼用啊