Java HashMap工作原理及實現(xiàn)

Hash table based implementation of the Map interface. This implementation provides all of the optional map operations, and permits null values and the null key. (The HashMap class is roughly equivalent to Hashtable, except that it is unsynchronized and permits nulls.) This class makes no guarantees as to the order of the map; in particular, it does not guarantee that the order will remain constant over time.
基于Map接口實現(xiàn)、允許null鍵/值砚作、非同步蛤袒、不保證有序(比如插入的順序)、也不保證序不隨時間變化膜赃。

hash函數(shù)的實現(xiàn)
通過hash的方法,通過put和get存儲和獲取對象揉忘。存儲對象時跳座,我們將K/V傳給put方法時端铛,它調(diào)用hashCode計算hash從而得到bucket位置,進一步存儲疲眷,HashMap會根據(jù)當(dāng)前bucket的占用情況自動調(diào)整容量(超過Load Facotr則resize為原來的2倍)禾蚕。獲取對象時,我們將K傳給get狂丝,它調(diào)用hashCode計算hash從而得到bucket位置换淆,并進一步調(diào)用equals()方法確定鍵值對。如果發(fā)生碰撞的時候几颜,Hashmap通過鏈表將產(chǎn)生碰撞沖突的元素組織起來倍试,在Java 8中,如果一個bucket中碰撞沖突的元素超過某個限制(默認(rèn)是8)蛋哭,則使用紅黑樹來替換鏈表易猫,從而提高速度。

put 函數(shù)的實現(xiàn) 思路
1具壮,對key 的hashCode()做hash 然后再計算index
2准颓,如果沒用碰撞直接放到bucket
3,如果碰撞了 棺妓,以鏈表的形式存在buckets
4攘已,如果碰撞導(dǎo)致鏈表過長 就把鏈表轉(zhuǎn)換成紅黑樹
5,如果節(jié)點已經(jīng)存在就替換old value(保證key 的唯一性)
6怜跑, 如果bucket 滿了 (超過load factory * current capacity) 就resize

get 函數(shù)的實現(xiàn)
1样勃,bucket 里的第一個節(jié)點 直接命中
2,如果有沖突 性芬,則通過key.equals(k) 去查找對應(yīng)的entry
若為樹 則在樹種通過 key.equals(k) o(logn)
若為鏈表 峡眶,則在鏈表中通過 key.equals(k) 查找 ,o(n)

hash的實現(xiàn)
在Java 1.8的實現(xiàn)中植锉,是通過hashCode()的高16位異或低16位實現(xiàn)的:(h = k.hashCode()) ^ (h >>> 16)辫樱,主要是從速度、功效俊庇、質(zhì)量來考慮的狮暑,這么做可以在bucket的n比較小的時候,也能保證考慮到高低bit都參與到hash的計算中辉饱,同時不會有太大的開銷搬男。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市彭沼,隨后出現(xiàn)的幾起案子缔逛,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件褐奴,死亡現(xiàn)場離奇詭異按脚,居然都是意外死亡,警方通過查閱死者的電腦和手機歉糜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來望众,“玉大人匪补,你說我怎么就攤上這事±煤玻” “怎么了夯缺?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長甘耿。 經(jīng)常有香客問我踊兜,道長,這世上最難降的妖魔是什么佳恬? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任捏境,我火速辦了婚禮,結(jié)果婚禮上毁葱,老公的妹妹穿的比我還像新娘垫言。我一直安慰自己,他們只是感情好倾剿,可當(dāng)我...
    茶點故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布筷频。 她就那樣靜靜地躺著,像睡著了一般前痘。 火紅的嫁衣襯著肌膚如雪凛捏。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天芹缔,我揣著相機與錄音坯癣,去河邊找鬼。 笑死最欠,一個胖子當(dāng)著我的面吹牛坡锡,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播窒所,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼鹉勒,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了吵取?” 一聲冷哼從身側(cè)響起禽额,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后脯倒,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體实辑,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年藻丢,在試婚紗的時候發(fā)現(xiàn)自己被綠了剪撬。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡悠反,死狀恐怖残黑,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情斋否,我是刑警寧澤梨水,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站茵臭,受9級特大地震影響疫诽,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜旦委,卻給世界環(huán)境...
    茶點故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一奇徒、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧缨硝,春花似錦逼龟、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至宜肉,卻和暖如春匀钧,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背谬返。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工之斯, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人遣铝。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓佑刷,卻偏偏與公主長得像,于是被迫代替她去往敵國和親酿炸。 傳聞我的和親對象是個殘疾皇子瘫絮,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,877評論 2 345

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

  • 很多剛學(xué)Java的同學(xué)們都知道HashMap,平常一般使用填硕,可能并不知道它的工作原理麦萤,前段時間有為剛畢業(yè)的同事在使...
    楊文杰閱讀 8,278評論 6 12
  • HashMap概述 Hash鹿鳖,又稱散列。哈希表是一種以鍵-值(key-value) 存儲數(shù)據(jù)的壮莹,和數(shù)組翅帜、鏈表、二叉...
    99793933e682閱讀 552評論 0 6
  • 土宮娘娘是“君主”火宮娘娘的唯一心腹命满,為了洞悉一切事務(wù)涝滴,自然要選在居高臨下的地段啦,而且不能離火宮娘娘太遠(yuǎn)胶台,否則報...
    體貼的忘憂草的春天閱讀 769評論 0 0
  • 吃飯愛好者閱讀 289評論 0 2
  • 今天一天挺閑的歼疮,閑的我有點不適應(yīng),總想找點事做概作,今天看到曉娜跟大龍的對話腋妙,看出她很著急要成果默怨,而我跟她比起來就差遠(yuǎn)...
    Hi_張閱讀 143評論 0 0