MAP學習筆記
1. 常用MAP
常用的Map有:HashMap、HashTable、ConcureentHashMap
三者的繼承樹如下圖:

2.MAP底層實作


由上圖可見,MAP底層為陣列+鏈表方式進行代碼實作,
HashMap與ConcureentHashMap在JDK1.8中又加入了紅黑樹進行查詢優化,


上圖可見,如果之前陣列中存盤的資料型別為TreeNode,也就是紅黑樹,那么之后存盤的資料型別都為TreeNode,如果陣列長度大于7,將原陣列重組,將Node陣列轉換為TreeNode陣列,
獲取Map元素時:

可以看出,如果陣列內型別是鏈表,則從最后一個元素向前遍歷查詢,如果陣列內型別是紅黑樹,則使用樹查詢,
3.HashMap的擴容機制
- 默認長度:DEFAULT_INITIAL_CAPACITY = 1 << 4,如果未指定map的長度,則系統默認16.
- 負載因子:DEFAULT_LOAD_FACTOR = 0.75f,陣列內占用長度達到了陣列lenth*0.75則進行重組擴容,每次擴容一倍,
JDK原始碼如下:

4.執行緒安全的Map
HashTable與ConcureentHashMap為執行緒安全的Map,
- HashTable是將所有操作陣列的方法加上了synchronized,
- ConcureentHashMap是將方法內涉及操作陣列的代碼片段添加了synchronized,
ConcureentHashMap內的鏈表結構:

用volatile修飾的變數,執行緒在每次使用變數的時候,都會讀取變數修改后的最的值,volatile很容易被誤用,用來進行原子性操作,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/195814.html
標籤:其他
