Java集合框架(JCF)是處理對象組的統一架構。Java 2重寫了集合庫(由Joshua Bloch主導),提供豐富的接口與實現。集合分兩大體系:Collection(單一元素序列)與Map(鍵值對)。本文聚焦Collection下的兩大支柱——List(有序、可重複)與Set(無序、唯一),剖析其接口契約、核心實現類特性、迭代器模式及選型指南。
Iterator是輕量級對象,屏蔽底層數據結構差異,提供單向遍歷:
iterator():獲取迭代器,首次next()返回首元素hasNext():判斷是否有下一元素next():返回下一元素並移動游標remove():刪除最近返回的元素(可選操作)ListIterator專為List設計,雙向遍歷(hasPrevious()/previous())、支持插入(add())、修改(set())、獲取索引(nextIndex()/previousIndex()),功能更強。
核心特徵:保持插入順序、允許重複元素、支持索引訪問(get(index))、提供ListIterator。新增方法:add(index, E)、remove(index)、set(index, E)、subList(from, to)等。
Object[] elementData,默認容量10,擴容1.5倍addFirst/Last、pollFirst/Last)Vector同步化、擴容2倍,已過時;CopyOnWriteArrayList寫時復制,讀無鎖,適合讀多寫少的併發場景。
核心特徵:元素唯一(依賴equals()判斷)、無序(除LinkedHashSet/TreeSet)、無索引訪問。存入對象必須正確重寫equals()與hashCode(),否則唯一性失效。
HashMap(值共用PRESENT常量)hashCode()分布HashSet,內部維護雙向鏈表記錄插入順序HashSetTreeMap(紅黑自平衡BST)Comparable)或比較器(Comparator)排序first()/last()/headSet()/tailSet()/subSet()範圍操作Comparable或提供Comparator| 場景 | 推薦實現 | 理由 |
|---|---|---|
| 高頻隨機訪問、少量增刪 | ArrayList | O(1)訪問、緩存友好 |
| 頻繁首尾/中間增刪、實現隊列棧 | LinkedList | O(1)首尾操作、ListIterator高效修改 |
| 去重、高性能查找、無序要求 | HashSet | O(1)平均性能 |
| 去重、保持插入順序 | LinkedHashSet | 有序+O(1)查找 |
| 去重、需排序/範圍查詢 | TreeSet | 有序+O(log n)範圍操作 |
| 併發讀多寫少列表 | CopyOnWriteArrayList | 讀無鎖、快照迭代器 |
| 併發Set | ConcurrentHashMap.newKeySet() | 高併發、弱一致性迭代器 |
List<T>/Set<T>,實例化具體實現,便於替換new ArrayList<>(capacity)避免多次擴容Iterator.remove()或併發集合,否則拋ConcurrentModificationExceptionList.of()、Set.of()創建不可變集合List與Set分別解決「有序可重複」與「無序唯一」兩類核心需求。掌握各實現類的數據結構特性(動態數組vs鏈表vs哈希表vs紅黑樹)、時間複雜度、併發行為,結合業務訪問模式(讀寫比、順序要求、範圍查詢),方能做出最優選型。現代開發中,還應關注Stream API、不可變集合、併發集合等進階特性,編寫更簡潔、健壯、高效的代碼。