hashmap底層原理

1、“你知道HashMap的工作原理嗎肖粮?” “你知道HashMap的get()方法的工作原理嗎桥帆?”

HashMap是基于hashing的原理,我們使用put(key, value)存儲對象到HashMap中谆构,使用get(key)從HashMap中獲取對象。當我們給put()方法傳遞鍵和值時算柳,我們先對鍵調用hashCode()方法低淡,返回的hashCode用于找到bucket位置來儲存Entry對象∷蚕睿”這里關鍵點在于指出蔗蹋,HashMap是在bucket中儲存鍵對象和值對象,作為Map.Entry囱淋。

2猪杭、“當兩個對象的hashcode相同會發(fā)生什么?”

因為hashcode相同妥衣,所以它們的bucket位置相同皂吮,‘碰撞’會發(fā)生。因為HashMap使用LinkedList存儲對象税手,這個Entry(包含有鍵值對的Map.Entry對象)會存儲在LinkedList中蜂筹。(當向 HashMap 中添加 key-value 對,由其 key 的 hashCode() 返回值決定該 key-value 對(就是 Entry 對象)的存儲位置芦倒。當兩個 Entry 對象的 key 的 hashCode() 返回值相同時艺挪,將由 key 通過 eqauls() 比較值決定是采用覆蓋行為(返回 true),還是產生 Entry 鏈(返回 false)兵扬。)

3麻裳、“如果兩個鍵的hashcode相同,你如何獲取值對象器钟?”

當我們調用get()方法津坑,HashMap會使用鍵對象的hashcode找到bucket位置,然后獲取值對象傲霸。如果有兩個值對象儲存在同一個bucket疆瑰,將會遍歷LinkedList直到找到值對象。找到bucket位置之后昙啄,會調用keys.equals()方法去找到LinkedList中正確的節(jié)點穆役,最終找到要找的值對象。(當程序通過 key 取出對應 value 時跟衅,系統(tǒng)只要先計算出該 key 的 hashCode() 返回值,在根據該 hashCode 返回值找出該 key 在 table 數(shù)組中的索引播歼,然后取出該索引處的 Entry伶跷,最后返回該 key 對應的 value 即可掰读。)

4、“如果HashMap的大小超過了負載因子(load factor)定義的容量叭莫,怎么辦蹈集?”

當一個map填滿了75%的bucket時候,和其它集合類(如ArrayList等)一樣雇初,將會創(chuàng)建原來HashMap大小的兩倍的bucket數(shù)組拢肆,來重新調整map的大小,并將原來的對象放入新的bucket數(shù)組中靖诗。這個過程叫作rehashing郭怪,因為它調用hash方法找到新的bucket位置。

5刊橘、“你了解重新調整HashMap大小存在什么問題嗎鄙才?”

當重新調整HashMap大小的時候,確實存在條件競爭促绵,因為如果兩個線程都發(fā)現(xiàn)HashMap需要重新調整大小了攒庵,它們會同時試著調整大小。在調整大小的過程中败晴,存儲在LinkedList中的元素的次序會反過來浓冒,因為移動到新的bucket位置的時候,HashMap并不會將元素放在LinkedList的尾部尖坤,而是放在頭部稳懒,這是為了避免尾部遍歷(tail traversing)。如果條件競爭發(fā)生了糖驴,那么就死循環(huán)了僚祷。這個時候,你可以質問面試官贮缕,為什么這么奇怪辙谜,要在多線程的環(huán)境下使用HashMap呢?

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末感昼,一起剝皮案震驚了整個濱河市装哆,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌定嗓,老刑警劉巖蜕琴,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異宵溅,居然都是意外死亡凌简,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進店門恃逻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來雏搂,“玉大人藕施,你說我怎么就攤上這事⊥怪#” “怎么了裳食?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長芙沥。 經常有香客問我诲祸,道長,這世上最難降的妖魔是什么而昨? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任救氯,我火速辦了婚禮,結果婚禮上配紫,老公的妹妹穿的比我還像新娘径密。我一直安慰自己,他們只是感情好躺孝,可當我...
    茶點故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布享扔。 她就那樣靜靜地躺著,像睡著了一般植袍。 火紅的嫁衣襯著肌膚如雪惧眠。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天于个,我揣著相機與錄音氛魁,去河邊找鬼。 笑死厅篓,一個胖子當著我的面吹牛秀存,可吹牛的內容都是我干的。 我是一名探鬼主播羽氮,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼或链,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了档押?” 一聲冷哼從身側響起澳盐,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎令宿,沒想到半個月后叼耙,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡粒没,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年筛婉,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片癞松。...
    茶點故事閱讀 40,102評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出癌幕,到底是詐尸還是另有隱情员寇,我是刑警寧澤,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布厕妖,位于F島的核電站首尼,受9級特大地震影響,放射性物質發(fā)生泄漏言秸。R本人自食惡果不足惜软能,卻給世界環(huán)境...
    茶點故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望举畸。 院中可真熱鬧查排,春花似錦、人聲如沸抄沮。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽叛买。三九已至砂代,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間率挣,已是汗流浹背刻伊。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留椒功,地道東北人捶箱。 一個月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像动漾,于是被迫代替她去往敵國和親丁屎。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,044評論 2 355

推薦閱讀更多精彩內容

  • 實際上谦炬,HashSet 和 HashMap 之間有很多相似之處悦屏,對于 HashSet 而言,系統(tǒng)采用 Hash 算...
    曹振華閱讀 2,513評論 1 37
  • ①HashMap的工作原理 HashMap基于hashing原理键思,我們通過put()和get()方法儲存和獲取對象...
    明教de教主閱讀 7,413評論 5 171
  • java筆記第一天 == 和 equals ==比較的比較的是兩個變量的值是否相等础爬,對于引用型變量表示的是兩個變量...
    jmychou閱讀 1,501評論 0 3
  • 三百六十五天 就是一年 歲月在樹上刻下年輪 在我們臉上刻下皺紋 當空氣中 爆竹的味道開始彌漫 回憶被勾到那些從前 ...
    白橋閱讀 178評論 0 0
  • 來到這個世間看蚜,屬于自己的不多不少,觸動自己心境的不多不少赔桌,裝點自己修為的不多不少供炎。 世間渴逻,冷與暖,陰與晴音诫,最奇妙的...
    世說興宇閱讀 392評論 6 7