Java容器中的List、Set、Map是核心數據結構,各自適用于不同的場景
一、List(有序、可重復)
List接口代表有序集合,允許元素重復和通過索引訪問,主要實現類包括:
ArrayList
底層結構:動態數組實現。
特點:支持快速隨機訪問(時間復雜度O(1)),但插入/刪除元素時需要移動數組,效率較低(時間復雜度O(n))。
適用場景:讀多寫少,需頻繁按索引查詢的場景,如數據緩存。
LinkedList
底層結構:雙向鏈表實現。
特點:插入/刪除效率高(時間復雜度O(1)),但隨機訪問效率低(需遍歷鏈表,時間復雜度O(n))。
擴展功能:可用作棧(push/pop)或隊列(offer/poll)。
Vector & Stack
線程安全:通過synchronized實現同步,但性能較低,已被CopyOnWriteArrayList取代。
Stack:基于數組的棧結構,但官方推薦用Deque接口替代。
CopyOnWriteArrayList
并發安全:寫操作時復制新數組,讀操作無鎖,適合讀多寫少的高并發場景。
缺點:內存占用高,數據可能延遲更新。
二、Set(無序、不可重復)
Set接口要求元素唯一性,主要實現類包括:
HashSet
底層結構:基于HashMap實現,哈希表存儲元素。
特點:插入/查詢效率高(時間復雜度O(1)),元素無序。
LinkedHashSet
擴展特性:維護插入順序的雙向鏈表,適合需要保持順序的集合。
TreeSet
底層結構:基于紅黑樹實現,元素按自然順序或自定義比較器排序。
特點:插入/查詢效率較低(時間復雜度O(log n)),但支持范圍查詢。
CopyOnWriteArraySet
并發安全:基于CopyOnWriteArrayList,通過addIfAbsent保證元素唯一性。
三、Map(鍵值對存儲)
Map接口存儲鍵值對(Key-Value),鍵唯一,主要實現類包括:
HashMap
底層結構:數組+鏈表/紅黑樹(JDK8優化沖突處理)。
特點:非線程安全,允許null鍵/值,查詢效率高(平均O(1))。
LinkedHashMap
擴展特性:維護插入順序或LRU(最近最少使用)順序。
TreeMap
底層結構:紅黑樹實現,鍵按自然順序或自定義排序。
適用場景:需有序遍歷鍵的場景,如排序字典。
ConcurrentHashMap
并發優化:JDK8后采用CAS和分段鎖,替代Hashtable。
特點:高并發下性能優于同步容器,適合多線程環境。
HashTable
遺留類:全表鎖導致性能低,不推薦使用
四、場景應用
容器 | 有序性 | 重復性 | 線程安全 | 典型應用場景 |
---|---|---|---|---|
ArrayList | 是(插入順序) | 允許 | 否(需并發容器) | 高頻隨機訪問的靜態數據 |
LinkedList | 是(插入順序) | 允許 | 否 | 頻繁插入/刪除的隊列或棧 |
HashSet | 否 | 禁止 | 否(需并發容器) | 快速去重的無序集合 |
TreeSet | 是(自然排序) | 禁止 | 否 | 需要排序或范圍查詢的集合 |
HashMap | 否 | 鍵唯一 | 否(需ConcurrentHashMap) | 高頻鍵值查詢的非同步場景 |
ConcurrentHashMap | 否 | 鍵唯一 | 是(分段鎖/CAS) | 高并發鍵值存儲 |
五、設計模式與底層原理
迭代器模式:所有容器均實現Iterable接口,通過Iterator遍歷元素,支持forEach循環。
適配器模式:如Arrays.asList()將數組適配為List。
寫時復制:CopyOnWriteArrayList通過復制新數組實現并發安全,減少鎖競爭。
實際使用根據業務場景決定。