What撕蔼?HashMap的實現(xiàn)原理豁鲤?

參考文章:HashMap實現(xiàn)原理及源碼分析

背景

上一篇文章《哈希表、hashCode鲸沮、HashMap的實現(xiàn)》講述了什么是哈希表琳骡、哈希函數(shù),以及點了一下HashMap讼溺,這篇文章著重講一下HashMap的實現(xiàn)原理楣号。

散列表

Hash table(散列表、哈希表)怒坯,當(dāng)我們需要存儲集合或字典炫狱,使用線性表、樹去存儲時剔猿,元素在存儲結(jié)構(gòu)中的位置與元素的關(guān)鍵碼之間不存在直接的對應(yīng)關(guān)系毕荐,所以在要搜索一個元素時都需要進行一系列的關(guān)鍵碼比較,搜索的效率取決于搜索過程進行的比較次數(shù)艳馒。而散列表(Hash table)是表示集合和字典的另一種有效方法,它提供了一種完全不同的存儲和搜索方式,通過關(guān)鍵碼映射到表中某個位置來存儲元素弄慰,然后根據(jù)關(guān)鍵碼用同樣的方式直接訪問第美。

HashMap實現(xiàn)原理

HashMap的主干是一個Entry數(shù)組。Entry是HashMap的基本組成單元陆爽,每一個Entry包含一個key-value鍵值對什往。

//HashMap的主干數(shù)組,可以看到就是一個Entry數(shù)組慌闭,初始值為空數(shù)組{}别威,主干數(shù)組的長度一定是2的次冪,至于為什么這么做驴剔,后面會有詳細分析省古。
transient Entry<K,V>[] table = (Entry<K,V>[]) EMPTY_TABLE;

Entry是HashMap中的一個靜態(tài)內(nèi)部類。代碼如下

 static class Entry<K,V> implements Map.Entry<K,V> {
        final K key;
        V value;
        Entry<K,V> next;//存儲指向下一個Entry的引用丧失,單鏈表結(jié)構(gòu)
        int hash;//對key的hashcode值進行hash運算后得到的值豺妓,存儲在Entry,避免重復(fù)計算

        /**
         * Creates new entry.
         */
        Entry(int h, K k, V v, Entry<K,V> n) {
            value = v;
            next = n;
            key = k;
            hash = h;
        }

所以布讹,HashMap的整體結(jié)構(gòu)如下


這里寫圖片描述

簡單來說琳拭,HashMap由數(shù)組+鏈表組成的,數(shù)組是HashMap的主體描验,鏈表則是主要為了解決哈希沖突而存在的白嘁,如果定位到的數(shù)組位置不含鏈表(當(dāng)前entry的next指向null),那么對于查找,添加等操作很快膘流,僅需一次尋址即可絮缅;如果定位到的數(shù)組包含鏈表,對于添加操作睡扬,其時間復(fù)雜度為O(n)盟蚣,首先遍歷鏈表,存在即覆蓋卖怜,否則新增屎开;對于查找操作來講,仍需遍歷鏈表马靠,然后通過key對象的equals方法逐一比對查找奄抽。所以,性能考慮甩鳄,HashMap中的鏈表出現(xiàn)越少逞度,性能才會越好。

關(guān)于hashCode
1. hashCode的存在主要是用于查找的快捷性妙啃,如Hashtable档泽,HashMap等俊戳,hashCode是用來在散列表中確定對象的存儲地址的。
2. 如果兩個對象相同馆匿,就是適用于equals(java.lang.Object) 方法抑胎,那么這兩個對象的hashCode一定要相同
3. 如果對象的equals方法被重寫,那么對象的hashCode也盡量重寫渐北,并且產(chǎn)生hashCode使用的對象阿逃,一定要和equals方法中使用的一致,否則就會違反上面提到的第2點
4. 兩個對象的hashCode相同赃蛛,并不一定表示兩個對象就相同恃锉,也就是不一定適用于equals(java.lang.Object) 方法,只能夠說明這兩個對象在散列存儲結(jié)構(gòu)中呕臂,如Hashtable破托,他們“存放在同一個籃子里“

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市诵闭,隨后出現(xiàn)的幾起案子炼团,更是在濱河造成了極大的恐慌,老刑警劉巖疏尿,帶你破解...
    沈念sama閱讀 222,729評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件瘟芝,死亡現(xiàn)場離奇詭異,居然都是意外死亡褥琐,警方通過查閱死者的電腦和手機锌俱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,226評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來敌呈,“玉大人贸宏,你說我怎么就攤上這事】暮椋” “怎么了吭练?”我有些...
    開封第一講書人閱讀 169,461評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長析显。 經(jīng)常有香客問我鲫咽,道長,這世上最難降的妖魔是什么谷异? 我笑而不...
    開封第一講書人閱讀 60,135評論 1 300
  • 正文 為了忘掉前任分尸,我火速辦了婚禮,結(jié)果婚禮上歹嘹,老公的妹妹穿的比我還像新娘箩绍。我一直安慰自己,他們只是感情好尺上,可當(dāng)我...
    茶點故事閱讀 69,130評論 6 398
  • 文/花漫 我一把揭開白布材蛛。 她就那樣靜靜地躺著圆到,像睡著了一般。 火紅的嫁衣襯著肌膚如雪仰税。 梳的紋絲不亂的頭發(fā)上构资,一...
    開封第一講書人閱讀 52,736評論 1 312
  • 那天,我揣著相機與錄音陨簇,去河邊找鬼。 笑死迹淌,一個胖子當(dāng)著我的面吹牛河绽,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播唉窃,決...
    沈念sama閱讀 41,179評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼耙饰,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了纹份?” 一聲冷哼從身側(cè)響起苟跪,我...
    開封第一講書人閱讀 40,124評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蔓涧,沒想到半個月后件已,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,657評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡元暴,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,723評論 3 342
  • 正文 我和宋清朗相戀三年篷扩,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片茉盏。...
    茶點故事閱讀 40,872評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡鉴未,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出鸠姨,到底是詐尸還是另有隱情铜秆,我是刑警寧澤,帶...
    沈念sama閱讀 36,533評論 5 351
  • 正文 年R本政府宣布讶迁,位于F島的核電站连茧,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏添瓷。R本人自食惡果不足惜梅屉,卻給世界環(huán)境...
    茶點故事閱讀 42,213評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望鳞贷。 院中可真熱鬧坯汤,春花似錦、人聲如沸搀愧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,700評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至搓幌,卻和暖如春杆故,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背溉愁。 一陣腳步聲響...
    開封第一講書人閱讀 33,819評論 1 274
  • 我被黑心中介騙來泰國打工处铛, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人拐揭。 一個月前我還...
    沈念sama閱讀 49,304評論 3 379
  • 正文 我出身青樓撤蟆,卻偏偏與公主長得像,于是被迫代替她去往敵國和親堂污。 傳聞我的和親對象是個殘疾皇子家肯,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,876評論 2 361

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