HashMap中是如何形成環形鏈表的


 定義:HashMap是有一個一維數組和一個鏈表組成,從而得知,在解決沖突問題時,hashmap選擇的是鏈地址法。
 
為什么HashMap會用一個數組這鏈表組成,當時給出的答案是從那幾種解決沖突的算法中推論的,這里給出一個正面的理由:
1,為什么用了一維數組:數組存儲區間是連續的,占用內存嚴重,故空間復雜的很大。但數組的二分查找時間復雜度小,為O(1);數組的特點是:尋址容易,插入和刪除困難
2,為什么用了鏈表:鏈表存儲區間離散,占用內存比較寬松,故空間復雜度很小,但時間復雜度很大,達O(N)。鏈表的特點是:尋址困難,插入和刪除容易
 
總結:而HashMap是兩者的結合,用一維數組存放散列地址,以便更快速的遍歷;用鏈表存放地址值,以便更快的插入和刪除!(關鍵詞:地址,存儲區間)
 
為何會形成環鏈(主要在這擴容的過程):
 
  當多個線程同時對這個HashMap進行put操作,而察覺到內存容量不夠,需要進行擴容時,多個線程會同時執行resize操作,而這就出現問題了,問題的原因分析如下:
     1).首先,在HashMap擴容時,會改變鏈表中的元素的順序,將元素從鏈表頭部插入。
     2).而環形鏈表就在這一時刻發生,以下模擬2個線程同時擴容。
         假設,當前hashmap的空間為2(臨界值為1),hashcode分別為0和1,在散列地址0處有元素A和B,這時候要添加元素C,C經過hash運算,得到散列地址為1,
                    這時候由於超過了臨界值,空間不夠,需要調用resize方法進行擴容,那么在多線程條件下,會出現條件競爭
 

————————————————
版權聲明:本文為CSDN博主「jiangjunlanzhoulan」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接: https://blog.csdn.net/jiangjunlanzhoulan/java/article/details/81239054


免責聲明!

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



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