什么是二項式分布?
二項式分布就是只有兩種結果的概率事件 在執行n次之后 某種結果的分布情況,就是n次伯努利實驗,比如拋了n次硬幣,k次正面的概率。
概率 = (k->n) p^k (1-p)^(n-k)這種的拋20次 出現 7次正面的概率,p是每次拋出現正面的概率也就是0.5。
兩個重點:
- 每次試驗獨立:第n次試驗不受n-1次試驗的影響,也不影響n+1次試驗;
- 結果有且只有兩個,並且互相對立:要么成功,要么失敗,成功的概率+失敗的概率=1;
這個就是二項式分布
什么是泊松分布?
是離散隨機分布的一種,通常被使用在估算在 一段特定時間/空間內發生成功事件的數量的概率。泊松分布是二項分布p趨近於零、n趨近於無窮大的極限形式。
在某個時間/空間內出現的二項式分布。
就像這種,當n趨近於無線大的時候的概率。
二項式分布的期望是 E(x) = np = μ => p = μ/n 所以
=》
=》
=》 μ=λ
說到這里其實要知道hashmap里面的閾值是 thershold = loadFactor*capacity 的;而默認的loadFactor是0.75,官網解釋是說泊松分布算出來的,其實不然,這里泊松分布算出來的樹出現的概率,當樹化的閾值是8,加載系數是0.75的時候 出現樹化的概率為 0 .00000006,jdk開發設計hashmap的時候,為了平衡樹和鏈表的性能(樹比鏈表遍歷快,但是樹的結點是鏈表結點大小的兩倍,所以當樹出現的概率比較小的時候的性價比就高了,所以取加載系數的時候平衡了下性能 取0.75)。平衡性能其實就是平衡時間與空間 個人認為。
- 原注釋的內容和目的都是為了解釋在java8 HashMap中引入Tree Bin(也就是放入數據的每個數組bin從鏈表node轉換為red-black tree node)的原因
- 原注釋:Because TreeNodes are about twice the size of regular nodes, we use them only when bins contain enough nodes to warrant use(see TREEIFY_THRESHOLD).
- TreeNode雖然改善了鏈表增刪改查的性能,但是其節點大小是鏈表節點的兩倍
- 雖然引入TreeNode但是不會輕易轉變為TreeNode(如果存在大量轉換那么資源代價比較大),根據泊松分布來看轉變是小概率事件,性價比是值得的
- 泊松分布是二項分布的極限形式,兩個重點:事件獨立、有且只有兩個相互對立的結果
- 泊松分布是指一段時間或空間中發生成功事件的數量的概率
- 對HashMap table[]中任意一個bin來說,存入一個數據,要么放入要么不放入,這個動作滿足二項分布的兩個重點概念
- 對於HashMap.table[].length的空間來說,放入0.75*length個數據,某一個bin中放入節點數量的概率情況如上圖注釋中給出的數據(表示數組某一個下標存放數據數量為0~8時的概率情況)
- 舉個例子說明,HashMap默認的table[].length=16,在長度為16的HashMap中放入12(0.75*length)個數據,某一個bin中存放了8個節點的概率是0.00000006
- 擴容一次,16*2=32,在長度為32的HashMap中放入24個數據,某一個bin中存放了8個節點的概率是0.00000006
- 再擴容一次,32*2=64,在長度為64的HashMap中放入48個數據,某一個bin中存放了8個節點的概率是0.00000006
所以,當某一個bin的節點大於等於8個的時候,就可以從鏈表node轉換為treenode,其性價比是值得的。