1、數據結構與核心特性
接口 | 數據結構 | 順序性 | 唯一性 | 鍵值對 | null 元素 |
---|---|---|---|---|---|
List | 動態數組/鏈表 | 有序(插入順序) | 允許重復 | 否 | 允許多個 null |
Set | 哈希表 / 紅黑樹 | 無序(HashSet)有序(LinkedHashSet/TreeSet) | 不允許重復 | 否 | 僅 HashSet/LinkedHashSet 允許 1 個 null |
Map | 哈希表 / 紅黑樹 鏈表長度≥8 時轉紅黑樹 | 無序(HashMap)有序(LinkedHashMap/TreeMap) | 鍵(Key)唯一 | 是 | 鍵:HashMap 允許 1 個 null值 |
2、實現類對比
List
- ArrayList:基于動態數組,隨機訪問快(O (1)),插入 / 刪除慢(O (n))。
- LinkedList:基于雙向鏈表,插入 / 刪除快(O (1)),隨機訪問慢(O (n))。
- Vector:線程安全(同步方法),性能低于 ArrayList。
Set - HashSet:基于 HashMap,無序,依賴hashCode()和equals()。
- LinkedHashSet:繼承 HashSet,維護插入順序(或訪問順序)。
- TreeSet:基于 TreeMap,有序(自然排序或自定義 Comparator),不允許 null。
Map - HashMap:線程不安全,允許 null 鍵 / 值,無序。
- LinkedHashMap:繼承 HashMap,維護插入順序(或訪問順序)。
- TreeMap:基于紅黑樹,按鍵排序(自然排序或自定義 Comparator),不允許 null 鍵。
- ConcurrentHashMap:線程安全(分段鎖 / CAS),高并發場景優先選擇。
- Hashtable:線程安全(同步方法),不允許 null 鍵 / 值,性能低。
3、線程安全性
- List:ArrayList/LinkedList 非線程安全,Vector/CopyOnWriteArrayList 線程安全。
- Set:HashSet/TreeSet 非線程安全,CopyOnWriteArraySet/ConcurrentSkipListSet 線程安全。
- Map:HashMap/TreeMap 非線程安全,ConcurrentHashMap/Hashtable 線程安全。
4、適用場景
- List:需要有序、可重復數據,頻繁隨機訪問(如分頁查詢結果)。
- Set:需要去重、無需順序(如權限去重),或需要有序且唯一(如排行榜)。
- Map:需要鍵值對映射(如配置緩存),或需要按鍵排序(如時間軸數據)。
5、性能優化
- 初始容量:創建集合時預估大小,避免頻繁擴容(如new ArrayList<>(100))。
- HashMap 加載因子:默認 0.75,高并發場景可調整以平衡空間和時間。
- TreeSet/TreeMap:插入 / 刪除 / 查詢時間復雜度 O (log n),適用于需要排序的場景。
6、常見坑點
- Set 去重依賴方法:自定義對象需重寫hashCode()和equals()。
- Map 的鍵不可變:使用自定義對象作為鍵時,確保其不可變(如 String、Integer)。
- ConcurrentHashMap 迭代器弱一致性:迭代時不拋出ConcurrentModificationException,但可能反映部分修改。
7、源碼層面理解
- ArrayList 擴容機制:每次擴容為原容量的 1.5 倍(oldCapacity + (oldCapacity >> 1))。
- HashMap哈希沖突處理:鏈表 + 紅黑樹(JDK 8+,鏈表長度≥8 且容量≥64 時轉換為樹)。
- TreeSet 排序實現:基于 TreeMap 的NavigableMap接口,通過compareTo()或Comparator排序