HashMap負載因子為什么是0.75


待寫

HashMap負載因子為什么是0.75?
HashMap有一個初始容量大小,默認是16
static final int DEAFULT_INITIAL_CAPACITY = 1 << 4; // aka 16    
為了減少沖突概率,當HashMap的數組長度達到一個臨界值就會觸發擴容,把所有元素rehash再放回容器中,這是一個非常耗時的操作。
而這個臨界值由負載因子和當前的容量大小來決定:
DEFAULT_INITIAL_CAPACITY*DEFAULT_LOAD_FACTOR
即默認情況下數組長度是16*0.75=12時,觸發擴容操作。
所以使用hash容器時盡量預估自己的數據量來設置初始值。
那么,為什么負載因子要默認為0.75,在HashMap注釋中有這么一段:
Ideally, under random hashCodes, the frequency of
* nodes in bins follows a Poisson distribution
* (http://en.wikipedia.org/wiki/Poisson_distribution) with a
* parameter of about 0.5 on average for the default resizing
* threshold of 0.75, although with a large variance because of
* resizing granularity. Ignoring variance, the expected
* occurrences of list size k are (exp(-0.5) * pow(0.5, k) /
* factorial(k)). The first values are:
*
* 0:    0.60653066
* 1:    0.30326533
* 2:    0.07581633
* 3:    0.01263606
* 4:    0.00157952
* 5:    0.00015795
* 6:    0.00001316
* 7:    0.00000094
* 8:    0.00000006
* more: less than 1 in ten million
*
在理想情況下,使用隨機哈希嗎,節點出現的頻率在hash桶中遵循泊松分布,同時給出了桶中元素的個數和概率的對照表。
從上表可以看出當桶中元素到達8個的時候,概率已經變得非常小,也就是說用0.75作為負載因子,每個碰撞位置的鏈表長度超過8個是幾乎不可能的。
hash容器指定初始容量盡量為2的冪次方。
HashMap負載因子為0.75是空間和時間成本的一種折中。

 

泊松分布:https://blog.csdn.net/ccnt_2012/article/details/81114920


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM