Map 實現類 | 線程安全否 | 自然排序 | Key的底層結構 |
Key是否可爲null |
特性 |
HashMap | 否 | 無序 | 數組+(鏈表或者紅黑樹) |
是 hash(null) = 0; 因此,map.get(null) 是有值的 |
查詢快,O(1) |
TreeMap | 否 | 迭代時中序遍歷,按自然順序排序(按ASCII排序,即按Key的HashCode排序) | 紅黑樹 | 否(沒做 null 判斷) | 查詢快,有序O(lgN) |
LinkedHashMap | 否 |
按查詢順序排序; 按訪問順序排序;(設置AceessOrder = True) |
數組 鏈表 +(鏈表或紅黑樹) |
是 hash(null) = 0 |
Linked保證迭代的順序; Hash保證單次訪問速度 |
HashTable | 是 | 無序 | 數組 |
否 (有判定不能爲null key) |
線程安全,但效率低 |
ConcurrentHashMap | 是 | 無序 | 數組 + (鏈表或者紅黑樹) |
否 (有判定不能爲null key 或者 value) |
線程安全,CAS實現樂觀鎖。 |
ConcurrentSkipHashMap | 是 |
可自定義排序; 按自然順序排序(按ASCII排序,即按Key的HashCode排序) 按自然順序倒序排序; 默認按自然排序 |
數組 + (鏈表或者紅黑樹) |
否 (有判定不能爲null key) |
線程安全,CAS實現樂觀鎖; 有序,且可以自定義排序 |
1,思考:爲什麼線程安全的集合都不允許插入null key 或者 null value?