HashMap中的equals()和hashCode()

HashMap中的equals和hashCode數組

Java的Object對象有9個方法,其中的equals()和hashCode()在hashMap的實現裏面起着比較重要的做用,我在研究hashMap的源碼時就遇到了它們倆,此篇博文主要是爲了記錄它們之間的相愛相殺。ide

爲了說明它們的關係,咱們須要HashMap的背景知識。對象

HashMap的存儲方式:
HashMap的實現方式是數組鏈,不一樣的對象根據其哈希碼hashCode方法的返回值)找到對應的數組下標,而後存入數組。不一樣的對象有相同的哈希碼時怎麼辦?這就由數組鏈中的鏈來解決了,相同哈希碼的對象都放在同一條鏈上,該鏈的鏈頭指向數組,進而造成數組鏈。get

當第一個對象已經存入HashMap,第二個對象準備存入HashMap時,系統在查找到數組下標後若發現它們的hashCode相同(數組下標相同)(也就是衝突),會調用equals()來檢查它們之間的關係,會有相應有如下兩種處理方法:
1. 若是相等,系統就再也不存入第二個對象;
若是不等,系統視它們爲純粹的下標衝突,將它們放在同一條鏈上;(拉鍊桶)
若是它們的hashCode不相同,直接存入第二個對象。
源碼

equals()匹配但hashCode()不一樣:會發生不可預料的事情
如今假設有兩個對象,它們的equals()相匹配,但hashCode()卻不一樣,讓咱們好好分析一下當它們存入HashMap時會發生什麼。hash

假設StringA和StringB是兩個不一樣的對象,內容都是」hello,world」,equals()返回true,但hashCode()返回值不同。咱們把StringA和StringB看成Key,分別對應着ValueA和ValueB。it

在StringA和ValueA已經存入HashMap後,咱們嘗試存入StringB和ValueB,由於hashCode不一樣,StringB和ValueB順利地進入HashMap.class

咱們寫一個查詢:HashMap.get(「hello,world」),此時會發生什麼呢?咱們取回的到底是ValueA仍是ValueB?不可預料。方法

或者換一下,咱們寫一個查詢:HashMap.get(StringA),此時會發生什麼呢?咱們取回的到底是ValueA仍是ValueB?不可預料。查詢

再換一下,咱們寫一個查詢:HashMap.get(StringB),此時會發生什麼呢?咱們取回的到底是ValueA仍是ValueB?不可預料。

因此咱們常說,若是equals匹配,hashCode()必定要相同,否則就有神奇的事情發生。

相關文章
相關標籤/搜索