日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

漫画:什么是HashMap?

發(fā)布時(shí)間:2024/9/3 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 漫画:什么是HashMap? 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

簡(jiǎn)介:?眾所周知,HashMap是一個(gè)用于存儲(chǔ)Key-Value鍵值對(duì)的集合,每一個(gè)鍵值對(duì)也叫做Entry。這些個(gè)鍵值對(duì)(Entry)分散存儲(chǔ)在一個(gè)數(shù)組當(dāng)中,這個(gè)數(shù)組就是HashMap的主干。那你知道HashMap默認(rèn)的初識(shí)長(zhǎng)度是多少?為什么這么規(guī)定?高并發(fā)情況下,為什么HashMap可能會(huì)出現(xiàn)死鎖?在Java8當(dāng)中,HashMap的結(jié)構(gòu)有什么樣的優(yōu)化?本文將為你深度解讀HashMap的靈魂三問(wèn)!

原文鏈接









眾所周知,HashMap是一個(gè)用于存儲(chǔ)Key-Value鍵值對(duì)的集合,每一個(gè)鍵值對(duì)也叫做Entry。這些個(gè)鍵值對(duì)(Entry)分散存儲(chǔ)在一個(gè)數(shù)組當(dāng)中,這個(gè)數(shù)組就是HashMap的主干。

HashMap數(shù)組每一個(gè)元素的初始值都是Null。


對(duì)于HashMap,我們最常使用的是兩個(gè)方法:Get 和 Put

1.Put方法的原理

調(diào)用Put方法的時(shí)候發(fā)生了什么呢?

比如調(diào)用 hashMap.put(“apple”, 0) ,插入一個(gè)Key為“apple”的元素。這時(shí)候我們需要利用一個(gè)哈希函數(shù)來(lái)確定Entry的插入位置(index):

index = Hash(“apple”)

假定最后計(jì)算出的index是2,那么結(jié)果如下:

但是,因?yàn)镠ashMap的長(zhǎng)度是有限的,當(dāng)插入的Entry越來(lái)越多時(shí),再完美的Hash函數(shù)也難免會(huì)出現(xiàn)index沖突的情況。比如下面這樣:

這時(shí)候該怎么辦呢?我們可以利用鏈表來(lái)解決。

HashMap數(shù)組的每一個(gè)元素不止是一個(gè)Entry對(duì)象,也是一個(gè)鏈表的頭節(jié)點(diǎn)。每一個(gè)Entry對(duì)象通過(guò)Next指針指向它的下一個(gè)Entry節(jié)點(diǎn)。當(dāng)新來(lái)的Entry映射到?jīng)_突的數(shù)組位置時(shí),只需要插入到對(duì)應(yīng)的鏈表即可:

需要注意的是,新來(lái)的Entry節(jié)點(diǎn)插入鏈表時(shí),使用的是“頭插法”。至于為什么不插入鏈表尾部,后面會(huì)有解釋。

2.Get方法的原理

使用Get方法根據(jù)Key來(lái)查找Value的時(shí)候,發(fā)生了什么呢?

首先會(huì)把輸入的Key做一次Hash映射,得到對(duì)應(yīng)的index:

index = Hash(“apple”)

由于剛才所說(shuō)的Hash沖突,同一個(gè)位置有可能匹配到多個(gè)Entry,這時(shí)候就需要順著對(duì)應(yīng)鏈表的頭節(jié)點(diǎn),一個(gè)一個(gè)向下來(lái)查找。假設(shè)我們要查找的Key是“apple”:

第一步,我們查看的是頭節(jié)點(diǎn)Entry6,Entry6的Key是banana,顯然不是我們要找的結(jié)果。

第二步,我們查看的是Next節(jié)點(diǎn)Entry1,Entry1的Key是apple,正是我們要找的結(jié)果。

之所以把Entry6放在頭節(jié)點(diǎn),是因?yàn)镠ashMap的發(fā)明者認(rèn)為,后插入的Entry被查找的可能性更大。











之前說(shuō)過(guò),從Key映射到HashMap數(shù)組的對(duì)應(yīng)位置,會(huì)用到一個(gè)Hash函數(shù):
index = Hash(“apple”)

如何實(shí)現(xiàn)一個(gè)盡量均勻分布的Hash函數(shù)呢?我們通過(guò)利用Key的HashCode值來(lái)做某種運(yùn)算。

index = HashCode(Key) % Length ?

如何進(jìn)行位運(yùn)算呢?有如下的公式(Length是HashMap的長(zhǎng)度):
index = HashCode(Key) & (Length – 1)

下面我們以值為“book”的Key來(lái)演示整個(gè)過(guò)程:

1.計(jì)算book的hashcode,結(jié)果為十進(jìn)制的3029737,二進(jìn)制的101110001110101110 1001。

2.假定HashMap長(zhǎng)度是默認(rèn)的16,計(jì)算Length-1的結(jié)果為十進(jìn)制的15,二進(jìn)制的1111。

3.把以上兩個(gè)結(jié)果做與運(yùn)算,101110001110101110 1001 & 1111 = 1001,十進(jìn)制是9,所以 index=9。

可以說(shuō),Hash算法最終得到的index結(jié)果,完全取決于Key的Hashcode值的最后幾位。


假設(shè)HashMap的長(zhǎng)度是10,重復(fù)剛才的運(yùn)算步驟:

單獨(dú)看這個(gè)結(jié)果,表面上并沒(méi)有問(wèn)題。我們?cè)賮?lái)嘗試一個(gè)新的HashCode 101110001110101110?1011

讓我們?cè)贀Q一個(gè)HashCode 101110001110101110 1111 試試 :

是的,雖然HashCode的倒數(shù)第二第三位從0變成了1,但是運(yùn)算的結(jié)果都是1001。也就是說(shuō),當(dāng)HashMap長(zhǎng)度為10的時(shí)候,有些index結(jié)果的出現(xiàn)幾率會(huì)更大,而有些index結(jié)果永遠(yuǎn)不會(huì)出現(xiàn)(比如0111)!

這樣,顯然不符合Hash算法均勻分布的原則。

反觀長(zhǎng)度16或者其他2的冪,Length-1的值是所有二進(jìn)制位全為1,這種情況下,index的結(jié)果等同于HashCode后幾位的值。只要輸入的HashCode本身分布均勻,Hash算法的結(jié)果就是均勻的。


總結(jié)

以上是生活随笔為你收集整理的漫画:什么是HashMap?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产精品815.cc红桃 | 四虎影院污 | 久久精品电影 | 欧美精品在线免费观看 | 校园春色亚洲激情 | 精品国产网站 | 裸体裸乳免费看 | 国产激情文学 | 亚洲50p | 国产精品地址 | 青青草手机视频在线观看 | 秘密的基地| 日韩一区在线观看视频 | 国产夫绿帽单男3p精品视频 | 精品视频一二三 | youjizzxxx69| 久艹视频在线观看 | 三级av网址| 国精产品一区一区三区 | 久久久无码18禁高潮喷水 | 久久精品99国产精品日本 | 秋霞福利影院 | 国产一区999 | 少妇无码av无码专区在线观看 | 国产黄色免费在线观看 | 亚洲品质自拍视频网站 | 激情小视频在线观看 | 99久久精品一区二区三区 | 大奶一区 | 成人国产片| 99视频在线免费观看 | 网站在线观看你懂的 | 久色精品视频 | 91av观看| 亚洲尤物视频 | 久久久久人妻一区精品色欧美 | 色视频免费观看 | 日韩精品久久一区 | 极度诱惑香港电影完整 | 亚洲一区有码 | 日韩r级在线观看 | 蜜桃精品久久久久久久免费影院 | 亚洲精品四区 | 99福利网 | 黄色网页入口 | 亚洲最大福利网 | 亚洲蜜桃在线 | 日韩欧美成人一区二区 | 国产精品二区一区 | 欧美一级片在线播放 | 国产明星换脸xxxx色视频 | 污片视频在线观看 | 最新中文字幕久久 | 91精产国品一二三区在线观看 | av网站在线播放 | 成人在线观看网站 | 国产波霸爆乳一区二区 | 曰本毛片 | 色哟哟入口国产精品 | 精品免费囯产一区二区三区 | 日本成人精品 | 黄色成人免费视频 | 娇妻被肉到高潮流白浆 | 美女赤身免费网站 | 成人在线电影网站 | 成人性生活免费视频 | 亚洲成人资源 | 日韩二区视频 | 日韩三级一区二区三区 | 欧美性受xxxx黑人xyx | 国产69精品久久久久999小说 | 色人综合 | 国产免费a视频 | 人人人人爽 | 人人干天天干 | 亚洲乱码一区二区三区在线观看 | 欧美日韩a√ | 不卡av网| 极度诱惑香港电影完整 | 双乳被四个男人吃奶h文 | 亚洲成人网在线观看 | 蜜桃av一区二区三区 | 孕妇毛片 | 欧美精品第一页 | 欧美在线一卡 | 国产区精品在线观看 | 国产精品久久久久高潮 | 右手影院亚洲欧美 | 国产又粗又黄又爽视频 | 欧美黄色一级大片 | 精品国产综合 | 久久久久www | 偷拍自拍一区 | 国产自精品 | 中文在线字幕免费观看 | av中文字幕第一页 | 欧美xxxx黑人又粗又长密月 | 美女视频网址 | 亚洲精品中文字幕在线播放 |