HashMap類簡介

1 基本定義

數(shù)據(jù)結(jié)構(gòu)

數(shù)據(jù)結(jié)構(gòu) 數(shù)組 鏈表 紅黑樹
用途 存儲鍵值對崎溃。數(shù)組下標(biāo)為鍵的哈希值 解決哈希沖突 解決哈希沖突

定義參數(shù)

參數(shù) initialCapacity loadFactor
用途 用于定義數(shù)組容量匪蟀,但數(shù)組是延遲初始化的员寇。如果不是2的整數(shù)冪,會適當(dāng)擴大蛋辈。 負載因子色鸳,默認0.75舞萄。用于定義擴容閾值threshold\text{threshold} = \text{initialCapacity}' * \text{loadFactor}

基本特性
HashMap中允許null值和null鍵誊稚。null鍵對應(yīng)著哈希值0翔始,即數(shù)組的下表0。

HashMap是不保證對象的放入順序的里伯。

基本操作get和`put的時間性能基本為O(1)(如果不考慮哈希沖突的情況下)城瞎。


2 基本操作


判斷hash/key,key值是否相等疾瓮,hash值是否相等
判斷是否是TreeNode脖镀,如果是從根節(jié)點二分查找(**問題TreeNode.find的最后的if else)


判斷table是否存在
判斷節(jié)點是否存在
如果是Tree節(jié)點,執(zhí)行RB插入狼电;
如果不是Tree節(jié)點蜒灰,執(zhí)行鏈表插入,如果大于TREEIFY_THRESHOLD肩碟,則樹化强窖。

擴容
計算新容量和新擴容閾值
拷貝

  1. 如果是桶中是單個節(jié)點,重新hash到新表中削祈。
  2. 如果是樹節(jié)點翅溺,遍歷樹切分為低于和高于舊閾值的兩個鏈表,然后進行分別判斷是否進行樹化髓抑。
  3. 如果是鏈表咙崎,遍歷樹切分為低于和高于舊閾值的兩個鏈表。

樹和鏈表轉(zhuǎn)換
保持節(jié)點相對順序吨拍。
使用類和哈希值進行比較褪猛。


3 哈希算法

在哈希值隨機且擴容閾值為默認值0.75的情況下,哈希表每個桶的頻率遵循\lambda=5泊松分布密末。由于擴容時粒度較大握爷,進而導(dǎo)致泊松分布的方差也很大跛璧。如果忽略方差的因素,哈希表桶列表長度為k的概率為e^{-0.5}*\frac{0.5^k}{k!}新啼。第一批值如下:

0:    0.60653066
1:    0.30326533
2:    0.07581633
3:    0.01263606
4:    0.00157952
5:    0.00015795
6:    0.00001316
7:    0.00000094
8:    0.00000006
more: less than 1 in ten million

哈希算法

  • 直接尋址法(Identity hash function)
  • 識字分析法
  • 平方取中法
  • 折疊法
  • 隨機數(shù)法
  • 除留取余法

沖突解決方法

  • 開放定址法(線性探測追城、二次/平方探測、雙散列探測)
  • 拉鏈法
  • 再哈希
  • 公共溢出區(qū)

參考資料

  1. java-hashmap-tail-traversing
  2. Hash function
  3. Consistent hashing
  4. HashMap的死循環(huán)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末燥撞,一起剝皮案震驚了整個濱河市座柱,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌物舒,老刑警劉巖色洞,帶你破解...
    沈念sama閱讀 222,807評論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異冠胯,居然都是意外死亡火诸,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,284評論 3 399
  • 文/潘曉璐 我一進店門荠察,熙熙樓的掌柜王于貴愁眉苦臉地迎上來置蜀,“玉大人,你說我怎么就攤上這事悉盆《⒒纾” “怎么了?”我有些...
    開封第一講書人閱讀 169,589評論 0 363
  • 文/不壞的土叔 我叫張陵焕盟,是天一觀的道長秋秤。 經(jīng)常有香客問我,道長脚翘,這世上最難降的妖魔是什么灼卢? 我笑而不...
    開封第一講書人閱讀 60,188評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮堰怨,結(jié)果婚禮上芥玉,老公的妹妹穿的比我還像新娘。我一直安慰自己备图,他們只是感情好灿巧,可當(dāng)我...
    茶點故事閱讀 69,185評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著揽涮,像睡著了一般帝洪。 火紅的嫁衣襯著肌膚如雪赁严。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,785評論 1 314
  • 那天,我揣著相機與錄音骂蓖,去河邊找鬼滤祖。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的溉跃。 我是一名探鬼主播,決...
    沈念sama閱讀 41,220評論 3 423
  • 文/蒼蘭香墨 我猛地睜開眼告抄,長吁一口氣:“原來是場噩夢啊……” “哼撰茎!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起打洼,我...
    開封第一講書人閱讀 40,167評論 0 277
  • 序言:老撾萬榮一對情侶失蹤龄糊,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后募疮,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體炫惩,經(jīng)...
    沈念sama閱讀 46,698評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,767評論 3 343
  • 正文 我和宋清朗相戀三年阿浓,在試婚紗的時候發(fā)現(xiàn)自己被綠了他嚷。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,912評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡搔扁,死狀恐怖爸舒,靈堂內(nèi)的尸體忽然破棺而出蟋字,到底是詐尸還是另有隱情稿蹲,我是刑警寧澤,帶...
    沈念sama閱讀 36,572評論 5 351
  • 正文 年R本政府宣布鹊奖,位于F島的核電站苛聘,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏忠聚。R本人自食惡果不足惜设哗,卻給世界環(huán)境...
    茶點故事閱讀 42,254評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望两蟀。 院中可真熱鬧网梢,春花似錦、人聲如沸赂毯。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,746評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽党涕。三九已至烦感,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間膛堤,已是汗流浹背手趣。 一陣腳步聲響...
    開封第一講書人閱讀 33,859評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留肥荔,地道東北人绿渣。 一個月前我還...
    沈念sama閱讀 49,359評論 3 379
  • 正文 我出身青樓朝群,卻偏偏與公主長得像,于是被迫代替她去往敵國和親中符。 傳聞我的和親對象是個殘疾皇子潜圃,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,922評論 2 361

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

  • 移步數(shù)據(jù)結(jié)構(gòu)--容器匯總(java & Android)由于 HashMap 底層涉及到太多方面,一篇文章總是不能...
    凱玲之戀閱讀 831評論 0 5
  • 摘要 HashMap是Java程序員使用頻率最高的用于映射(鍵值對)處理的數(shù)據(jù)類型舟茶。隨著JDK(Java Deve...
    周二倩你一生閱讀 1,255評論 0 5
  • 1 概述本文將從幾個常用方法下手谭期,來閱讀HashMap的源碼。按照從構(gòu)造方法->常用API(增吧凉、刪隧出、改、查)的順序...
    小小的coder閱讀 181評論 0 0
  • 認知深度和知識架構(gòu)引領(lǐng)并決定了每個人的腳步阀捅,善于聆聽胀瞪,才能與他人的智慧建立鏈接,最終成為自己的坐標(biāo)系饲鄙。 ...
    時間Lee閱讀 440評論 1 7
  • 五點:1.前輪過線 2.打方向 3.庫角 4.底線 5.停車點 1.正常情況 ①起始位置:前控制線介于車內(nèi)側(cè)門把手...
    琢磨啥呢閱讀 402評論 0 0