HashMap的存取原理你知道多少

作者:小秋? ? ? ? 公眾號:苦逼的碼農(nóng)

在java的容器集合中,hashmap的使用頻率可以說是相當高的馒索。不過對于hashmap的存(put())以及取(get())的原理可能很多人還不大清楚渐白,今天碟婆,我就給大家介紹下它是如何存如何取的过吻。

下面以回答問題的形式來講解

假如有面試官問你进泼,hashmap是如何存數(shù)據(jù),你會怎么回答纤虽?

  1. 我想每個人都知道hashmap是以鍵值對的方式來存數(shù)據(jù)的乳绕,有些人可能會這么回答:當我們執(zhí)行put(key, value)函數(shù)的時候,以key作為鍵逼纸,value作為值來存洋措,并且如果key相同的話,則新的value會覆蓋掉舊的value杰刽。


這時面試官可能會問你菠发,如果兩個key對象的hashcode相同怎么辦?

  1. 對于不熟悉hashcode()和equals()這兩個方法的人來說贺嫂,他可能會直接說滓鸠,因為hashcode相同,那么兩個對象是同一個對象第喳,進而新的value覆蓋掉舊的value糜俗。如果你這樣回答,后果你懂 曲饱。(當然可能面試會提醒你或直接問你別的問題了)悠抹。
  2. 這個時候跑出來個第三者,自豪著補充了一句:根據(jù)hashcode找到對應的bucket之后扩淀,還會在對應的鏈表逐一檢查這個鏈表里有沒存在相同的key對象楔敌,這個時候是通過equals這個方法來對比的。如果有驻谆,者用新的value取代舊的value梁丘。如果沒有侵浸,則向樓上說的,在鏈表的尾部加上這個新的Entry對象氛谜。

  • 這個時候掏觉,hashmap的put原理講解就告一段落了。下面說說獲取get(key)原理
  • 其實get原理和put原理是差不多的值漫,一個逆向的過程澳腹。
  1. 當我們調(diào)用get(key)的時候,會調(diào)用key的hashcode方法獲得hashcode.
  2. 根據(jù)hashcode獲取相應的bucket杨何。
  3. 由于一個bucket對應的鏈表中可能存有多個Entry,這個時候會調(diào)用key的equals方法來找到對應的Entry
  4. 最后把值返回(這句好像是廢話….但我還是想說下)酱塔。

繼續(xù)漲知識……

  • 這里先給大家解釋下 負載因子:負載因子(load factor,假設大小為n)就是當一個map填滿了n倍的bucket的時候,hashmap就會進行擴容危虱。
  • 其實當一個map被填滿到75%的時候(默認的負載因子大小是0.75)羊娃,它就會進行擴容,創(chuàng)建一個大小是原理兩倍的bucket數(shù)組埃跷,并且將原理的數(shù)據(jù)存放到新的數(shù)組里蕊玷。

大家都知道,當Map在擴容新的數(shù)組并且移動數(shù)據(jù)的時候弥雹,都是比較消耗時間和內(nèi)存的垃帅,如果我們事先能預測到我們到存的數(shù)據(jù)的大致大小的話,我們就可以新創(chuàng)建hashmap的時候指定大小剪勿,這樣贸诚,可以大小減少擴容帶來的消耗。

  • 這里可能大家有一些疑問厕吉,例如為啥默認的負載因子大小是0.75呢(看有些人在討論這個問題)酱固。對于這個我覺得可能是通過大量的數(shù)據(jù)測出來的(還沒有去百度看別人的解答,僅代表個人觀點头朱,歡迎你們的解答)
  • 這里在給大家解釋以下負載因子的作用(可能有些人還不知道負載因子的干啥用的)
  1. 負載因子越大媒怯,數(shù)組要被填滿時,元素就會越多髓窜,元素越多扇苞,沖突的幾率就會越大,一個鏈表存的元素也會越多寄纵,查詢的時候就會越慢鳖敷。但是,此時空間的利用率更高了——空間換時間
  2. 負載因此越小程拭,數(shù)組要被填滿時定踱,元素就會越少,沖突也會也少恃鞋,一個鏈表的元素也會越少崖媚,查詢的時候也就越快亦歉。但是,空間的利用率低了——-時間換空間畅哑。

  • 暫時先講到這里肴楷,大家如果有什么疑問。歡迎提出
  • 如果有哪里講錯了荠呐,非常歡迎指點出來
?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末赛蔫,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子泥张,更是在濱河造成了極大的恐慌呵恢,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,820評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件媚创,死亡現(xiàn)場離奇詭異渗钉,居然都是意外死亡,警方通過查閱死者的電腦和手機钞钙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評論 3 399
  • 文/潘曉璐 我一進店門鳄橘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來歇竟,“玉大人,你說我怎么就攤上這事盅安。” “怎么了蝙寨?”我有些...
    開封第一講書人閱讀 168,324評論 0 360
  • 文/不壞的土叔 我叫張陵贝奇,是天一觀的道長掉瞳。 經(jīng)常有香客問我霎褐,道長瘩欺,這世上最難降的妖魔是什么歌粥? 我笑而不...
    開封第一講書人閱讀 59,714評論 1 297
  • 正文 為了忘掉前任枣购,我火速辦了婚禮涩堤,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己福荸,他們只是感情好敬锐,可當我...
    茶點故事閱讀 68,724評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般丰泊。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上亏推,一...
    開封第一講書人閱讀 52,328評論 1 310
  • 那天学赛,我揣著相機與錄音,去河邊找鬼吞杭。 笑死盏浇,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的芽狗。 我是一名探鬼主播绢掰,決...
    沈念sama閱讀 40,897評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼童擎!你這毒婦竟也來了滴劲?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,804評論 0 276
  • 序言:老撾萬榮一對情侶失蹤顾复,失蹤者是張志新(化名)和其女友劉穎班挖,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體芯砸,經(jīng)...
    沈念sama閱讀 46,345評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡萧芙,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,431評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了乙嘀。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片末购。...
    茶點故事閱讀 40,561評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡破喻,死狀恐怖虎谢,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情曹质,我是刑警寧澤婴噩,帶...
    沈念sama閱讀 36,238評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站羽德,受9級特大地震影響几莽,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜宅静,卻給世界環(huán)境...
    茶點故事閱讀 41,928評論 3 334
  • 文/蒙蒙 一章蚣、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧姨夹,春花似錦纤垂、人聲如沸矾策。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,417評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽贾虽。三九已至,卻和暖如春吼鱼,著一層夾襖步出監(jiān)牢的瞬間蓬豁,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,528評論 1 272
  • 我被黑心中介騙來泰國打工菇肃, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留地粪,地道東北人。 一個月前我還...
    沈念sama閱讀 48,983評論 3 376
  • 正文 我出身青樓琐谤,卻偏偏與公主長得像驶忌,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子笑跛,可洞房花燭夜當晚...
    茶點故事閱讀 45,573評論 2 359

推薦閱讀更多精彩內(nèi)容