首先,想要明白hashCode的作用,你必須先知道Java中的集合。
總的來說,Java中的集合(Collection)有兩類,一類是List,再有一類是Set。
你知道它們的差別嗎?前者集合內的元素是有序的,元素可以重複;後者元素無序,但元素不可重複。
那麼這裡就有一個比較嚴重的問題了:要保證元素不重複,可兩個元素是否重複應該依據什麼來判斷呢?
這就是Object.equals方法了。但是,如果每增加一個元素就檢查一次,那麼當元素很多時,後面加入集合中的元素比較的次數就非常多了。
也就是說,如果集合中現在已經有1000個元素,那麼第1001個元素加入集合時,它就要呼叫1000次equals方法。這顯然會大大降低效率。
於是,Java採用了哈希表的原理。哈希(Hash)實際上是個人名,由於他提出一哈希演算法的概念,所以就以他的名字命名了。
哈希演算法也稱為雜湊演算法,是將資料依特定演算法直接指定到一個位址上。如果詳細講解雜湊演算法,那需要更多的文章篇幅,我在這裡就不介紹了。
初學者可以這樣理解,hashCode方法實際上回傳的就是物件儲存的實體位址(實際上可能不是)。
這樣一來,當集合要加入新的元素時,先呼叫這個元素的hashCode方法,就一下子能定位到它應該放置的實體位置。
如果這個位置上沒有元素,它就可以直接儲存在這個位置上,不用再進行任何比較了;如果這個位置上已經有元素了,
就呼叫它的equals方法與新元素進行比較,相同的話就不存了,不相同就散列其它的位址。
所以這裡有一個衝突解決的問題。這樣一來實際呼叫equals方法的次數就大大降低了,幾乎只需要一兩次。
所以,Java對於eqauls方法和hashCode方法是這樣規定的:
1.如果兩個物件相同,那麼它們的hashCode值一定要相同;2、如果兩個物件的hashCode相同,它們並不一定相同上面說的物件相同指的是用eqauls方法比較。
你當然可以不照要求去做了,但你會發現,相同的物件可以出現在Set集合中。同時,增加新元素的效率會大大下降。 hashcode這個方法是用來鑑定2個物件是否相等的。
那你會說,不是還有equals這個方法嗎? 不錯,這2個方法都是用來判斷2個物件是否相等的。但是他們是有差別的。 一般來講,equals這個方法是給使用者呼叫的,如果你想判斷2個物件是否相等,
你可以重寫equals方法,然後在程式碼中調用,就可以判斷他們是否相等了。簡單來講,equals方法主要是用來判斷從表面上看或從內容上看,2個物件是不是相等。舉個例子,有個學生類,
屬性只有姓名和性別,那麼我們可以認為只要姓名和性別相等,那就說這2個物件是相等的。 hashcode方法一般使用者不會去調用,例如在hashmap中,由於key是不可以重複的,
他在判斷key是不是重複的時候就判斷了hashcode 這個方法,而且也用到了equals方法。這裡不可以重複是說equals和hashcode只要有個不等就好了!所以簡單來講,hashcode相當於是一個物件的編碼,就好像檔案中的md5,他和equals不同就在於他回傳的是int型的,比較起來不直觀。我們一般在覆蓋equals的同時也要覆蓋hashcode,讓他們的邏輯一致。舉個例子,
還是剛剛的例子,如果姓名和性別相等就算2個物件相等的話,那麼hashcode的方法也要回傳姓名的hashcode值加上性別的hashcode值,這樣從邏輯上,他們就一致了。
要從物理上判斷2個物件是否相等,用==就可以了