HashMap高並發下存在的問題


原文鏈接: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代碼如下:

 

 

 

 

 


免責聲明!

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



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