91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

HashMap中的equals()和hashCode()有什么不同?

發布時間:2020-05-26 14:53:09 來源:億速云 閱讀:378 作者:鴿子 欄目:編程語言

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()一定要相同,不然就有神奇的事情發生。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

宁晋县| 城步| 栾川县| 色达县| 龙陵县| 寻乌县| 南康市| 兰西县| 德江县| 奉贤区| 东莞市| 冀州市| 年辖:市辖区| 鱼台县| 天气| 泌阳县| 红原县| 大足县| 同心县| 吉木萨尔县| 屯昌县| 叙永县| 永春县| 自贡市| 辉县市| 安吉县| 巴林右旗| 城步| 罗平县| 敦化市| 苏尼特右旗| 无棣县| 皮山县| 湛江市| 陈巴尔虎旗| 清涧县| 神农架林区| 航空| 营山县| 朝阳市| 永福县|