HashMap的負載因子為什麼默認是0.75?這篇文章告訴你答案

2021-01-10 愚公要移山1

之前寫過一篇專門介紹HashMap的文章,反響很不錯,不過在留言區問得最多的問題就是HashMap的負載因子初始值為什麼是0.75,私下又好好地研究了一番,總結了這篇文章。

本篇文章基於JDK1.8,特在此說明。

OK。下面我們就開始進行分析。

HashMap源碼分析(jdk1.8,保你能看懂)

一、負載因子的作用

對於HashMap的研究,我之前一直停留在考慮源碼是如何實現的,現在當我重新再來看的時候,才發現,系統默認的各種參數值,才是HashMap的精華所在。

負載因子是和擴容機制有關的,意思是如果當前容器的容量,達到了我們設定的最大值,就要開始執行擴容操作。舉個例子來解釋,避免小白聽不懂:

比如說當前的容器容量是16,負載因子是0.75,16*0.75=12,也就是說,當容量達到了12的時候就會進行擴容操作。

他的作用很簡單,相當於是一個擴容機制的閾值。當超過了這個閾值,就會觸發擴容機制。HashMap源碼已經為我們默認指定了負載因子是0.75。

我截取了部分源碼,從這裡可以看出,系統默認的負載因子值就是0.75,而且我們還可以在構造方法中去指定。下面我們就正式來分析一下為什麼是默認的0.75。

二、原因解釋(重點)

我們在考慮HashMap的時候,首先要想到的是HashMap只是一個數據結構,既然是數據結構最主要的就是節省時間和空間。負載因子的作用肯定也是節省時間和空間。為什麼節省呢?我們考慮兩種極端情況。

1、負載因子是1.0

我們先看HashMap的底層數據結構

我們的數據一開始是保存在數組裡面的,當發生了Hash碰撞的時候,就是在這個數據節點上,生出一個鍊表,當鍊表長度達到一定長度的時候,就會把鍊表轉化為紅黑樹。

當負載因子是1.0的時候,也就意味著,只有當數組的8個值(這個圖表示了8個)全部填充了,才會發生擴容。這就帶來了很大的問題,因為Hash衝突時避免不了的。當負載因子是1.0的時候,意味著會出現大量的Hash的衝突,底層的紅黑樹變得異常複雜。對於查詢效率極其不利。這種情況就是犧牲了時間來保證空間的利用率。

因此一句話總結就是負載因子過大,雖然空間利用率上去了,但是時間效率降低了。

2、負載因子是0.5

負載因子是0.5的時候,這也就意味著,當數組中的元素達到了一半就開始擴容,既然填充的元素少了,Hash衝突也會減少,那麼底層的鍊表長度或者是紅黑樹的高度就會降低。查詢效率就會增加。

但是,兄弟們,這時候空間利用率就會大大的降低,原本存儲1M的數據,現在就意味著需要2M的空間。

一句話總結就是負載因子太小,雖然時間效率提升了,但是空間利用率降低了。

3、負載因子0.75

經過前面的分析,基本上為什麼是0.75的答案也就出來了,這是時間和空間的權衡。當然這個答案不是我自己想出來的。答案就在源碼上,我們可以看看:

大致意思就是說負載因子是0.75的時候,空間利用率比較高,而且避免了相當多的Hash衝突,使得底層的鍊表或者是紅黑樹的高度比較低,提升了空間效率。

OK,寫到這答案基本上就出來了,一句話能總結的寫成了一篇文章。如有問題,還請批評指正。

相關焦點

  • 面試官:HashMap加載因子為什麼是0.75?當場懵了
    HashMap的確有很多細節值得我們注意,正如被問到HashMap加載因子為什麼是0.75?,好了廢話不多說,直接上源碼分享。HashMap加載因子是什麼?HashMap的底層結構是哈希表 ,是以鍵值對形式存儲的。
  • 面試官:HashMap默認負載因子0.75和泊松分布有關係嗎
    我們在看HashMap源碼時,知道HashMap默認的負載因子是0.75。那這個0.75是怎麼來的呢?通常,加載因子需要在時間和空間成本上尋求一種折中。選擇0.75作為默認的加載因子,完全是時間和空間成本上尋求的一種折中選擇HashMap源碼中有段注釋,如下:翻譯如下:通常,默認加載因子 (.75) 在時間和空間成本上尋求一種折中。
  • Java初學者進階系列:HashMap的容量與性能
    HashMap的容量與性能HashMap的性能受到兩個參數的影響:初始化容量和負載因子,下面來詳細講述這幾個關鍵問題。Load Factor:負載因子,它表示HashMap的負載程度,換句話說,它表示HashMap到底有多滿了,是不是需要擴容了,這個值默認是0.75f。初始化容量和負載因子的默認值是Java官方經過實踐和優化得到的數據,可以適應大多數的場景。
  • 看完這篇 HashMap,和面試官扯皮就沒問題了
    「默認負載因子」HashMap 的默認負載因子是staticfinalfloat DEFAULT_LOAD_FACTOR = 0.75f;float 類型所以用 .f 為單位,負載因子是和擴容機制有關,這裡大致提一下,後面會細說。
  • 這本期刊影響因子縮水60%,還發了篇奇葩文章
    至於為什麼會在武漢爆發疫情?目前的SCI影響因子為1.862分,在177本生物遺傳學SCI專業期刊中,落到了130位,這本期刊想回Q1Q2並不難,繼續看你就會明白。WOS收錄了自1982年起發表的467篇文章,包括449篇綜述文章,以及18篇Editorial Material。
  • 這篇文章會告訴你答案
    這篇文章會告訴你答案大家好我是你們的小熊,四隻腳的熊,今天下編要給大家介紹的是如何才能製作乾冰冰淇淋?用二氧化碳滅火器製造的冰激凌是完全可食用的,只是不要吃那些有可能夾在冰激凌中的硬塊,那可能是遺留的乾冰。這是什麼原理呢?液體蒸發的時候會變冷。例如,當一個人身上被弄溼的時候會感覺很冷。
  • 看完這篇文章,告訴你答案
    看完這篇文章,告訴你答案近日,有網友諮詢說,網上看到很多關於開燈睡覺影響孩子身高的報導,這個到底是不是真的呢?是不是又是謠言呢?我可以很明確的告訴各位朋友,這個不是謠言,是真的。今天就這個開燈睡覺導致矮小症和大家詳細的說一說。
  • 程式設計師英語-HashMap源碼解讀
    如果對迭代性能要求較高,那麼不要將初始容量設得過高或者負載因子設得過低(初始容量過高或負載因子過低,都會導致較多的空桶)。An instance of HashMap has two parameters that affect its performance: initial capacity and load factor.
  • 搞定HashMap面試,深入講解HashMap的工作原理
    除了table屬性(註:table[i]=bucket,包含該位置的所有node),還有幾個屬性需要提前了解:/*** The default initial capacity - MUST be a power of two.* 數組的初始化容量,必須是2的冪次方,默認16。* 為什麼不直接寫16。鄙人猜測是:可能大師要告訴我們HashMap的容量必須是2的冪次方。
  • 這篇文章來給你答案!
    這篇文章來給你答案!關於汽車油耗的計算方法粗略計算是比較簡單的,加了多少升油大概跑了多少公裡簡單相除就能計算出來,同樣也可以計算每公裡的錢數,就像問題所說的,如果230元跑了420公裡這兩個數據準確,那每公裡的費用就是230÷420≈0.55元/公裡,當然想要準確計算出百公裡油耗相對還是有些小麻煩的,下面就具體來說一個準確的油耗計算方法。
  • 這篇文章告訴你什麼是高級氧化技術
    這篇文章告訴你什麼是高級氧化技術北極星水處理網訊:高級氧化技術又稱深度氧化技術,其基礎在於運用電、光輻照、催化劑,有時還與氧化劑結合,在反應中產生活性極強的自由基(如HO•),再通過自由基與有機化合物之間的加合、取代、電子轉移、斷鍵等,使水體中的大分子難降解有機物氧化降解成低毒或無毒的小分子物質,甚至直接降解成為
  • 數據收集篇之十二: GR&R中的ANOVA問題答案
    11: MSA的這兩張圖你會看嗎?另一方面也是我對此沒有答案,所以撰文求助。參見《問題徵解:MSA的ANOVA分析問題》在留言中,啟明先生提出到《試驗設計與分析》中尋找答案,為我指出了方向,秦波老師明確要考慮SOV的思路,這給了我很大的啟發,於是我翻開了手頭王萬中的《試驗的設計與分析》(不是啟明先生推薦的那本書)。
  • 這篇文章,告訴你蛋白粉的功效與作用
    人體每日約有3%的蛋白質會進行更新,這部分的蛋白質攝入必不可少。蛋白質對人體的作用主要為以下幾部分:①組成人體的成分:機體中每個細胞和所有組織的重要組成成分都有蛋白質的參與。②調節人體的生理功能:蛋白質構成了多種重要激素及消化酶,在輔助遺傳、維持滲透壓等生理功能都有重要的作用。
  • 車主快看,新手開車為什麼偏道?這篇文章來給你答案!
    車主快看,新手開車為什麼偏道?這篇文章來給你答案!新手開車偏道,會出現偏向一側(偏左/偏右)不出本車道和忽左忽右、左右不定偏出本車道兩種現象。剛好我就是新手,17年9月份拿到駕照到現在就上過兩次路,我來說說我自己的感受吧:新手開車為什麼容易偏道?
  • 這篇文章來給你答案!
    這篇文章來給你答案!一些壁虎的標誌是在網上購買汽車用品的時候被贈送的,比如說我在買汽車上的一些裝飾配件的時候,都會被贈送幾樣東西,一般就是一個小手帕,靜電貼,還有就是壁虎。畢竟是白送的,一些人也就貼在了車子上,這樣一來很多人也就都貼上了壁虎,甚至貼上很多壁虎的標誌也是在所難免的。像我買汽車用品不是太多,也有兩三個壁虎標誌在手扶箱裡面,只是·懶得貼上罷了。
  • 關於電磁爐的幾個問題 這篇文章給你答案
    但電磁爐工作時,人體與電磁爐中心的距離為0.4m、角度為90°的位置電磁輻射也有 300mG(3.00×10-5T)只有距離爐具 2m以外,電磁輻射才降到2mG以下。    若在2m外使用電磁爐,顯然不符合實際情況。
  • 你的硝化為什麼會崩潰?這篇文章告訴你!
    有時為了使出水NH3-N非常低,甚至採用F/M為0.05kgBOD/(kgMLVSS·d)的超低負荷。   與低負荷相對應,生物硝化系統的泥齡SRT一般較長,這主要是因為硝化細菌增殖速度較慢,世代期長,如果不保證足夠長的SRT,硝化細菌就培養不起來,也就得不到硝化效果。實際運行中,SRT控制在多少,取決於溫度等因素。
  • 這篇文章來給你答案!
    這篇文章來給你答案!提起雙離合這個詞語,相信很多人都是用質疑的眼光,為什麼呢?因為和三缸發動機一樣,雙離合尤其是乾式雙離合確實存在物理性的缺陷,這是很難避免的,但是話又說回來了,技術肯定是發展的,也要用進步的眼光的去看問題。
  • 這篇文章給你答案
    食品配送:旅行商問題的現實應用。NP 表示不確定性多項式時間(nondeterministic polynomial time),NP 問題是指在多項式時間內近似驗證答案的問題。但目前人們發現,很多此類問題需要指數時間才能求解。