我們在看HashMap源碼時,知道HashMap默認的負載因子是0.75。那這個0.75是怎麼來的呢?
通常,加載因子需要在時間和空間成本上尋求一種折中。
加載因子過高:例如為1,雖然減少了空間開銷,提高了空間利用率,但同時也增加了查詢時間成本。
加載因子過低:例如0.5,雖然可以減少查詢時間成本,但是空間利用率很低,同時提高了rehash操作的次數。
在設置初始容量時應該考慮到映射中所需的條目數及其加載因子,以便最大限度地減少rehash操作次數,所以一般在使用HashMap時建議根據預估值設置初始容量,減少擴容操作。
選擇0.75作為默認的加載因子,完全是時間和空間成本上尋求的一種折中選擇
HashMap源碼中有段注釋,如下:
翻譯如下:通常,默認加載因子 (.75) 在時間和空間成本上尋求一種折中。加載因子過高雖然減少了空間開銷,但同時也增加了查詢成本(在大多數 HashMap 類的操作中,包括 get 和 put 操作,都反映了這一點)。在設置初始容量時應該考慮到映射中所需的條目數及其加載因子,以便最大限度地減少 rehash 操作次數。如果初始容量大於最大條目數除以加載因子,則不會發生 rehash 操作。
有人說負載因子0.75和泊松分布有關係,那是什麼關係呢?
在HashMap的源碼中有這樣一段注釋:
泊松分布公式:
0.75作為加載因子,忽略方差,即X = λt,P(λt = k),其中t=1,λ=0.5,λt = 0.5,帶入後:
k=0,1,2…可以得出下表:
可以看到當用 0.75 作為加載因子時,桶中元素到達 8 個的時候,概率已經變得非常小,因此每個位置的鍊表長度超過 8 個是幾乎不可能的,因此在鍊表節點到達 8 時才開始轉化為紅黑樹。
加載因子是0.75,決定了桶中元素到達 8 個的時候概率很小,進而轉為紅黑樹;而不是到達 8 個的時候概率很小所以加載因子是0.75。
歡迎小夥伴們留言交流~~