HashMap系列:負載因子0.75

(一)HashMap系列:負載因子0.75
(二)HashMap系列:樹化閥值8,退化閥值6
(三)HashMap系列:2次方擴容
(四)HashMap系列:put元素(不看完將后悔一生6塾颉)

紅黑樹系列:
一释牺、《算法—深入淺出》N叉樹的介紹
二罪针、《算法—深入淺出》紅黑樹的旋轉(zhuǎn)
三、《算法—深入淺出》紅黑樹的插入
四、《算法—深入淺出》紅黑樹的刪除

一拂酣、前言

HashMap在JDK7與JDK8有些不同,主要是在 hash 沖突后比原,數(shù)據(jù)結(jié)構(gòu)的改變:

  • JDK7:數(shù)組 + 單鏈表插佛;
  • JDK8:數(shù)組 + 單鏈表 + 紅黑樹;

本篇的主題是負載因子(0.75)量窘,因此是針對數(shù)組來分析雇寇,為何是0.75這個值!

二蚌铜、負載因子的作用

在HashMap中锨侯,所有的對象都存儲在類型為 Node 的變量名為 table 的數(shù)組中:

transient Node<K,V>[] table;

該數(shù)組初始大小(capacity = 16)冬殃。

當 hash(key) 算出來的值囚痴,與已存在的發(fā)生沖突時,會在沖突的結(jié)點后添加新的結(jié)點审葬,此時就變成了鏈表深滚。

static class Node<K,V> implements Map.Entry<K,V> {
    final int hash;
    final K key;
    V value;
    Node<K,V> next;
}

每個 Node 對象初始時的 next 為 null ,只有在沖突時耳璧,next 才會指向下一個相同 hash(key) 但 key 不同的新的 Node 對象成箫。
當鏈表長度超過 8 時,將轉(zhuǎn)成『紅黑樹』旨枯;當『紅黑樹』的個數(shù)低于 6 時蹬昌,會重新轉(zhuǎn)化為鏈表;

隨著 table 中的數(shù)據(jù)越來越多攀隔,沖突會越來越頻繁皂贩,就會影響 HashMap 的執(zhí)行效率,無非時間或者空間昆汹,那到底是如何影響的呢明刷?

2.1、負載因子 = 1.0

負載因子為1.0時满粗,意味著辈末,只有當 table 全部被填滿,table 才會擴容映皆;當 table 中的元素越來越多時挤聘,會出現(xiàn)大量的沖突:

  • 若此時是鏈表,則查詢效率是 O(n)捅彻,即線性组去;(插入/刪除結(jié)點也要遍歷到鏈表);
  • 若此時是紅黑樹步淹,查詢效率是 O(logN)从隆,但紅黑樹的插入與刪除就異常復雜诚撵,每次都要調(diào)整樹;

因此键闺,負載因子1.0寿烟,實際是犧牲了時間,但保證了空間的利用率艾杏。

2.2韧衣、負載因子 = 0.5

負載因子為0.5時,意味著购桑,當 table 中的元素達到一半時,就發(fā)生擴容氏淑,table 容量擴大一倍:

  • hash 沖突減少勃蜘;
  • 鏈表長度不會很長;
  • 即便鏈表長度超過8時轉(zhuǎn)成紅黑樹假残,樹的高度也不會很高缭贡;

查詢效率提高了,但這里辉懒,我們發(fā)現(xiàn)阳惹,會有大量的內(nèi)存浪費,因為數(shù)組中的個數(shù)永遠小于數(shù)組長度的一半眶俩。
因此莹汤,負載因子0.5,實際是犧牲了空間颠印,但保證了時間效率纲岭。

2.3、負載因子 = 0.75

經(jīng)過上面的分析线罕,我們發(fā)現(xiàn) [0.5 , 1.0] 對應(yīng)著 [時間極端, 空間極端]止潮,那我們就需要找一個平衡點,這個點就是合理的負載因子值钞楼。
源碼中有解釋:

As a general rule, the default load factor (.75) offers a good tradeoff between time and space costs. Higher values decrease the space overhead but increase the lookup cost (reflected in most of the operations of the HashMap class, including get and put). The expected number of entries in the map and its load factor should be taken into account when setting its initial capacity, so as to minimize the number of rehash operations. If the initial capacity is greater than the maximum number of entries divided by the load factor, no rehash operations will ever occur.

其意思為:負載因子0.75較好的平衡了時間和空間成本喇闸,因子太高增加了查詢成本。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末询件,一起剝皮案震驚了整個濱河市燃乍,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌雳殊,老刑警劉巖橘沥,帶你破解...
    沈念sama閱讀 222,378評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異夯秃,居然都是意外死亡座咆,警方通過查閱死者的電腦和手機痢艺,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,970評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來介陶,“玉大人堤舒,你說我怎么就攤上這事〔肝兀” “怎么了舌缤?”我有些...
    開封第一講書人閱讀 168,983評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長某残。 經(jīng)常有香客問我国撵,道長,這世上最難降的妖魔是什么玻墅? 我笑而不...
    開封第一講書人閱讀 59,938評論 1 299
  • 正文 為了忘掉前任介牙,我火速辦了婚禮,結(jié)果婚禮上澳厢,老公的妹妹穿的比我還像新娘环础。我一直安慰自己,他們只是感情好剩拢,可當我...
    茶點故事閱讀 68,955評論 6 398
  • 文/花漫 我一把揭開白布慨绳。 她就那樣靜靜地躺著禁熏,像睡著了一般睦擂。 火紅的嫁衣襯著肌膚如雪女嘲。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,549評論 1 312
  • 那天呵晨,我揣著相機與錄音魏保,去河邊找鬼。 笑死摸屠,一個胖子當著我的面吹牛谓罗,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播季二,決...
    沈念sama閱讀 41,063評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼檩咱,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了胯舷?” 一聲冷哼從身側(cè)響起刻蚯,我...
    開封第一講書人閱讀 39,991評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎桑嘶,沒想到半個月后炊汹,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,522評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡逃顶,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,604評論 3 342
  • 正文 我和宋清朗相戀三年讨便,在試婚紗的時候發(fā)現(xiàn)自己被綠了充甚。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,742評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡霸褒,死狀恐怖伴找,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情废菱,我是刑警寧澤技矮,帶...
    沈念sama閱讀 36,413評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站殊轴,受9級特大地震影響衰倦,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜旁理,卻給世界環(huán)境...
    茶點故事閱讀 42,094評論 3 335
  • 文/蒙蒙 一耿币、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧韧拒,春花似錦、人聲如沸十性。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,572評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽劲适。三九已至楷掉,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間霞势,已是汗流浹背烹植。 一陣腳步聲響...
    開封第一講書人閱讀 33,671評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留愕贡,地道東北人草雕。 一個月前我還...
    沈念sama閱讀 49,159評論 3 378
  • 正文 我出身青樓,卻偏偏與公主長得像固以,于是被迫代替她去往敵國和親墩虹。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,747評論 2 361

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