HashMap和ConcurrentHashMap流程圖

本文表達HashMap和ConcurrentHashMap中的put()方法的執行流程圖,基於JDK1.8的源碼執行過程。

HashMap的put()方法:
這裏寫圖片描述

ConcurrentHashMap的put()方法:
final V putVal(K key, V value, boolean onlyIfAbsent) {….}
1.key或value是否爲空,是的話,拋異常new NullPointerException();
2.table是否爲空或length==0;是的話,初始化table;
3.根據key算出的hash值經過優化得到索引值i,如果i==-1,說明此時有線程擴容此鏈表,你需要去幫忙擴容。
4.i>=0,則找到table[i]對應的索引,爲空的話,就CAS添加;
5.table[i]不爲空,取出節點鎖住,表示鎖住此索引的所有鏈表或紅黑樹。判斷是key是否重複,重複的話就更新value,否者尾插入法,更新。如果是紅黑樹就紅黑樹插入。
6.插入後判斷鏈表的節點數是否大於8,是的話,轉換爲紅黑樹,
7.最後判斷concurrentHashMap容量,大於擴容值,就進行擴容。

HashMap的put()和resize()都是尾插節點;(JDK1.8)
ConcurrentHashMap的put()是尾插節點,tansfer()是頭插節點;(JDK1.8)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章