原文鏈接:https://blog.csdn.net/bjwfm2011/article/details/81076736
1、什么是HashMap?
HashMap底層原理
HashMap是存儲鍵值對(key-value)的集合,每個鍵值對也叫做Entry,這些Entry分散存儲在一個數組中,這個數組可以稱為HashMap的主干。
2、HashMap在高並發下會產生的情況
在分析高並發情況之前,需要搞清楚ReHash這個概念。(ReHash是HashMap在擴容時候的一個步驟)
HashMap的容量是有限的,當經過多次元素插入,使得HashMap達到一定的飽和度時,key映射位置發生沖突的幾率會逐漸提高,這時候HashMap需要擴展它的長度,就是進行Resize。
影響Resize的因素有兩個
- Capacity HashMap的當前長度;
- LoadFactor HashMap的負載因子,默認值是0.75f;
衡量HashMap是否進行Resize的條件:
HashMap.Size >= Capacity * LoadFactor
3、HashMap的Resize具體做了哪些事情呢?HashMap不是簡單的把長度擴大,而是經過了下面兩個步驟:
- 擴容:創建一個新的Entry空數組,長度是原數組的2倍。
- ReHash:遍歷原Entry數組,把所有的Entry重新Hash到新數組。為什么要重新Hash呢?因為長度擴大以后,Hash的規則也隨之改變。
Hash公式:index = HashCode(Key) & (Length - 1)
當原數組長度為8時,Hash運算是和111B做與運算;新數組長度為16,Hash運算是和1111B做與運算。Hash結果顯然不同。
Resize前的HashMap:
Resize后的HashMap:
ReHash的Java代碼如下: