為什麼 HashMap 中的load factor在各個語言的實現中都在 0 6 0 8 之間?

時間 2021-06-04 22:58:03

1樓:乾貨滿滿張雜湊

首先,這個基於乙個假設,那麼就是當乙個事件發生的概率大於 0.5,那麼這件事就是很可能發生的。

然後,假設當前有 s 個桶,那麼每次放入乙個元素進入某乙個桶的概率就是:

放入了第 n 個元素,那麼,某乙個桶元素個數為e的概率,根據二項式分布就是:

將e=0代入,得出:

讓這個概率大於 0.5 也就是 1/2

那麼解這個不等式,得到:

n" eeimg="1"/>

如果讓 s 趨近於無窮大,那麼 n/s 就無限接近於 log(2). 也就是放入的元素數量是所有桶的數量的 log(2) ~ 0.693

2樓:Excalibur

設定load factor的目的是為了提高hashmap的插值和取值效率。因此在考慮Load Factor取值範圍的時候,必須要考慮hashmap構成的兩種情況,Hashmap的構成方式是究竟是open address還是separate chain.

在open address的情況下,load factor的取值等價於 n/m。n為元素的數量,m為array的長度,我們對它的期望值一般為2/3,即0.667。

當load factor取值超過2/3時,效能開始變差。

而在separate chain的情況下,load factor的情況開始不同,因為separate chain是array的每個值套上乙個linked list,因此load factor可以超過1。

3樓:

正如題主說的,load factor的取值對於hashmap來說非常重要,因為太大了,則會影響到插入和查詢效率。太小了就會造成不斷擴容而影響hashmap的效能。不同語言對這個值的取值並不是完全一樣,因為目前來說更多的是從測試分析應該取多少合適。

這點可以在wikipedia上看到:

當load factor取值大於0.8的時候,線性探測的未命中數會急劇增加,這也意味著線性探測的效能在急劇下降。

java中hashmap為什麼key的值不一樣呼叫hashcode的hash值為什麼相同?

Intopass 因為KEY的 容量 有可能超過雜湊值 int型別 的容量,你從乙個大範圍對映到小範圍必然不可能保證一對一,只能是多對一。 hashcode的目的是實現對若干物件分批次,key的值不一樣 意味著不同的key之間呼叫equals 方法返回false。hashcode分批次的目的是,把大...

jdk1 8中為什麼說hashMap併發問題?

看雲 1.8雖然沒有了死鏈的問題,但還是存在size 問題,size不是原子操作,想想自己可以寫乙個多執行緒對乙個靜態變數做自增操作看出來的結果跟想的是不是一樣即可 Learner 文件裡都說不是執行緒安全的,然後非要在多執行緒環境下用,出了問題各種分析 告訴你前面有地雷,走過去炸死了,不斷分析為什...

hashmap為什麼要有負載因子?

愚公要移山 對於HashMap的研究,我之前一直停留在考慮原始碼是如何實現的,現在當我重新再來看的時候,才發現,系統預設的各種引數值,才是HashMap的精華所在。負載因子是和擴容機制有關的,意思是如果當前容器的容量,達到了我們設定的最大值,就要開始執行擴容操作。舉個例子來解釋,避免小白聽不懂 比如...