您好,登錄后才能下訂單哦!
HashMap中的equals和hashCode
Java的Object對象有9個方法,其中的equals()和hashCode()在hashMap的實現里面起著比較重要的作用,我在研究hashMap的源碼時就遇到了它們倆,此篇博文主要是為了記錄它們之間的相愛相殺。
為了說明它們的關系,我們需要HashMap的背景知識。
HashMap的存儲方式:
HashMap的實現方式是數組鏈,不同的對象根據其哈希碼hashCode方法的返回值)找到對應的數組下標,然后存入數組。不同的對象有相同的哈希碼時怎么辦?這就由數組鏈中的鏈來解決了,相同哈希碼的對象都放在同一條鏈上,該鏈的鏈頭指向數組,進而形成數組鏈。
當第一個對象已經存入HashMap,第二個對象準備存入HashMap時,系統在查找到數組下標后若發現它們的hashCode相同(數組下標相同)(也就是沖突),會調用equals()來檢查它們之間的關系,會有相應有以下兩種處理方法:
1. 如果相等,系統就不再存入第二個對象;
如果不等,系統視它們為純粹的下標沖突,將它們放在同一條鏈上;(拉鏈桶)
如果它們的hashCode不相同,直接存入第二個對象。
equals()匹配但hashCode()不同:會發生不可預料的事情
現在假設有兩個對象,它們的equals()相匹配,但hashCode()卻不同,讓我們好好分析一下當它們存入HashMap時會發生什么。
假設StringA和StringB是兩個不同的對象,內容都是”hello,world”,equals()返回true,但hashCode()返回值不一樣。我們把StringA和StringB當作Key,分別對應著ValueA和ValueB。
在StringA和ValueA已經存入HashMap后,我們嘗試存入StringB和ValueB,因為hashCode不同,StringB和ValueB順利地進入HashMap.
我們寫一個查詢:HashMap.get(“hello,world”),此時會發生什么呢?我們取回的究竟是ValueA還是ValueB?不可預料。
或者換一下,我們寫一個查詢:HashMap.get(StringA),此時會發生什么呢?我們取回的究竟是ValueA還是ValueB?不可預料。
再換一下,我們寫一個查詢:HashMap.get(StringB),此時會發生什么呢?我們取回的究竟是ValueA還是ValueB?不可預料。
所以我們常說,如果equals匹配,hashCode()一定要相同,不然就有神奇的事情發生。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。