HashMap的底層數(shù)據(jù)結(jié)構(gòu)以及主要參數(shù)

HashMap的幾個(gè)典型特點(diǎn):

  1.底層由鏈表+數(shù)組實(shí)現(xiàn)

  2.可以存儲(chǔ)null鍵和null值

 3.線性不安全

 4.初始容量為16纷责,擴(kuò)容每次都是2的n次冪(保證位運(yùn)算)

 5.加載因子為0.75,當(dāng)Map中元素總數(shù)超過(guò)Entry數(shù)組的0.75,觸發(fā)擴(kuò)容操作.

 6.并發(fā)情況下乡小,HashMap進(jìn)行put操作會(huì)引起死循環(huán)阔加,導(dǎo)致CPU利用率接近100%

 (1)HashMap底層實(shí)現(xiàn)數(shù)據(jù)結(jié)構(gòu)為數(shù)組+鏈表的形式,JDK8及其以后的版本中使用了數(shù)組+鏈表+紅黑樹實(shí)現(xiàn)胜榔,解決了鏈表太長(zhǎng)導(dǎo)致的查詢速度變慢的問(wèn)題。

 (2)簡(jiǎn)單來(lái)說(shuō)湃番,HashMap由數(shù)組+鏈表組成的夭织,數(shù)組是HashMap的主體吠撮,鏈表則是主要為了解決哈希沖突而存在的尊惰。HashMap通過(guò)key的HashCode經(jīng)過(guò)擾動(dòng)函數(shù)處理過(guò)后得到Hash值,然后通過(guò)位運(yùn)算判斷當(dāng)前元素存放的位置弄屡,如果當(dāng)前位置存在元素的話,就判斷該元素與要存入的元素的hash值以及key是否相同膀捷,如果相同的話迈嘹,直接覆蓋,不相同就通過(guò)拉鏈法解決沖突秀仲。當(dāng)Map中的元素總數(shù)超過(guò)Entry數(shù)組的0.75時(shí),觸發(fā)擴(kuò)容操作壶笼,為了減少鏈表長(zhǎng)度神僵,元素分配更均勻拌消。

HashMap的主要參數(shù):

DEFAULT_INITIAL_CAPACITY:默認(rèn)的初始化容量挑豌,1<<4位運(yùn)算的結(jié)果是16墩崩,也就是默認(rèn)的初始化容量為16。當(dāng)然如果對(duì)要存儲(chǔ)的數(shù)據(jù)有一個(gè)估計(jì)值鹦筹,最好在初始化的時(shí)候顯示的指定容量大小铝阐,減少擴(kuò)容時(shí)的數(shù)據(jù)搬移等帶來(lái)的效率消耗。同時(shí)铐拐,容量大小需要是2的整數(shù)倍。

MAXIMUM_CAPACITY:容量的最大值遍蟋,1 << 30位吹害,2的30次冪。

?DEFAULT_LOAD_FACTOR:默認(rèn)的加載因子它呀,設(shè)計(jì)者認(rèn)為這個(gè)數(shù)值是基于時(shí)間和空間消耗上最好的數(shù)值。這個(gè)值和容量的乘積是一個(gè)很重要的數(shù)值棒厘,也就是閾值纵穿,當(dāng)達(dá)到這個(gè)值時(shí)候會(huì)產(chǎn)生擴(kuò)容奢人,擴(kuò)容的大小大約為原來(lái)的二倍谓媒。

TREEIFY_THRESHOLD:因?yàn)閖dk8以后何乎,HashMap底層的存儲(chǔ)結(jié)構(gòu)改為了數(shù)組+鏈表+紅黑樹的存儲(chǔ)結(jié)構(gòu)(之前是數(shù)組+鏈表)句惯,剛開始存儲(chǔ)元素產(chǎn)生碰撞時(shí)會(huì)在碰撞的數(shù)組后面掛上一個(gè)鏈表,當(dāng)鏈表長(zhǎng)度大于這個(gè)參數(shù)時(shí)宗弯,鏈表就可能會(huì)轉(zhuǎn)化為紅黑樹脯燃,為什么是可能后面還有一個(gè)參數(shù),需要他們兩個(gè)都滿足的時(shí)候才會(huì)轉(zhuǎn)化辕棚。

UNTREEIFY_THRESHOLD:介紹上面的參數(shù)時(shí),我們知道當(dāng)長(zhǎng)度過(guò)大時(shí)可能會(huì)產(chǎn)生從鏈表到紅黑樹的轉(zhuǎn)化邓厕,但是逝嚎,元素不僅僅只能添加還可以刪除详恼,或者另一種情況补君,擴(kuò)容后該數(shù)組槽位置上的元素?cái)?shù)據(jù)不是很多了昧互,還使用紅黑樹的結(jié)構(gòu)就會(huì)很浪費(fèi),所以這時(shí)就可以把紅黑樹結(jié)構(gòu)變回鏈表結(jié)構(gòu)敞掘,什么時(shí)候變叽掘,就是元素?cái)?shù)量等于這個(gè)值也就是6的時(shí)候變回來(lái)(元素?cái)?shù)量指的是一個(gè)數(shù)組槽內(nèi)的數(shù)量,不是HashMap中所有元素的數(shù)量)玖雁。

??MIN_TREEIFY_CAPACITY:鏈表樹化的一個(gè)標(biāo)準(zhǔn),前面說(shuō)過(guò)當(dāng)數(shù)組槽內(nèi)的元素?cái)?shù)量大于8時(shí)可能會(huì)轉(zhuǎn)化為紅黑樹赫冬,之所以說(shuō)是可能就是因?yàn)檫@個(gè)值浓镜,當(dāng)數(shù)組的長(zhǎng)度小于這個(gè)值的時(shí)候,會(huì)先去進(jìn)行擴(kuò)容膛薛,擴(kuò)容之后就有很大的可能讓數(shù)組槽內(nèi)的數(shù)據(jù)可以更分散一些了,也就不用轉(zhuǎn)化數(shù)組槽后的存儲(chǔ)結(jié)構(gòu)了补鼻。當(dāng)然哄啄,長(zhǎng)度大于這個(gè)值并且槽內(nèi)數(shù)據(jù)大于8時(shí)辽幌,那就轉(zhuǎn)化為紅黑樹吧增淹。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末乌企,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子成玫,更是在濱河造成了極大的恐慌拳喻,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,723評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件猪腕,死亡現(xiàn)場(chǎng)離奇詭異冗澈,居然都是意外死亡陋葡,警方通過(guò)查閱死者的電腦和手機(jī)亚亲,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門腐缤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人岭粤,你說(shuō)我怎么就攤上這事惜索。” “怎么了剃浇?”我有些...
    開封第一講書人閱讀 152,998評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)虎囚。 經(jīng)常有香客問(wèn)我角塑,道長(zhǎng)溜宽,這世上最難降的妖魔是什么吉拳? 我笑而不...
    開封第一講書人閱讀 55,323評(píng)論 1 279
  • 正文 為了忘掉前任适揉,我火速辦了婚禮,結(jié)果婚禮上嫉嘀,老公的妹妹穿的比我還像新娘炼邀。我一直安慰自己,他們只是感情好剪侮,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,355評(píng)論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著瓣俯,像睡著了一般杰标。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上腔剂,一...
    開封第一講書人閱讀 49,079評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音驼仪,去河邊找鬼掸犬。 笑死,一個(gè)胖子當(dāng)著我的面吹牛湾碎,可吹牛的內(nèi)容都是我干的宙攻。 我是一名探鬼主播,決...
    沈念sama閱讀 38,389評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼座掘,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了柔滔?” 一聲冷哼從身側(cè)響起雹顺,我...
    開封第一講書人閱讀 37,019評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤廊遍,失蹤者是張志新(化名)和其女友劉穎嬉愧,沒(méi)想到半個(gè)月后喉前,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體没酣,經(jīng)...
    沈念sama閱讀 43,519評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡卵迂,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,971評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了见咒。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片偿衰。...
    茶點(diǎn)故事閱讀 38,100評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖改览,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情宝当,我是刑警寧澤视事,帶...
    沈念sama閱讀 33,738評(píng)論 4 324
  • 正文 年R本政府宣布,位于F島的核電站俐东,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏订晌。R本人自食惡果不足惜虏辫,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,293評(píng)論 3 307
  • 文/蒙蒙 一锈拨、第九天 我趴在偏房一處隱蔽的房頂上張望砌庄。 院中可真熱鬧,春花似錦鹤耍、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)跌造。三九已至杆怕,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間壳贪,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工违施, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留互纯,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,547評(píng)論 2 354
  • 正文 我出身青樓留潦,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親辣往。 傳聞我的和親對(duì)象是個(gè)殘疾皇子兔院,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,834評(píng)論 2 345