Java 集合框架是日常開發中使用頻率最高的 API 之一。本文梳理 Collection 體系與 Map 體系的核心實現類,分析其底層數據結構、性能特點與適用場景,助你做出最優選型決策。

圖例:虛線框 = 介面,實線框 = 具體類,空心箭頭 = 實現介面,實心箭頭 = 可生成對象。
| 實現類 | 底層結構 | 隨機訪問 | 增刪性能 | 線程安全 | 適用場景 |
|---|---|---|---|---|---|
| ArrayList | 動態陣列 | 快 O(1) | 慢 O(n) 需搬移元素 | 否 | 預設首選,適合多讀少寫 |
| LinkedList | 雙向鏈表 | 慢 O(n) | 快 O(1) 僅需修改指針 | 否 | 頻繁頭尾增刪、實現 Queue/Deque |
| Vector | 動態陣列 | 快 | 慢 | 是(synchronized) | 舊版遺留,不建議新代碼使用 |
| Stack | 繼承 Vector | - | - | 是 | 舊版遺留,建議用 ArrayDeque 替代 |
最佳實踐:優先使用 ArrayList;僅當性能分析證明頻繁中間插入刪除成為瓶頸時,才考慮 LinkedList。
| 實現類 | 特點 | 元素要求 | 順序保證 |
|---|---|---|---|
| HashSet | 查找極快 O(1) | 必須正確覆寫 hashCode() 與 equals() | 無序 |
| LinkedHashSet | 兼具查找速度與插入順序/訪問順序 | 同 HashSet | 維護插入順序或 LRU 順序 |
| 實現類 | 特點 | 元素要求 | 順序保證 |
|---|---|---|---|
| TreeSet | 元素自動排序,範圍查詢高效 | 實現 Comparable 或構造時傳入 Comparator | 自然順序或定製順序 |
// 方式一:元素實現 Comparable
class Stick implements Comparable<Stick> {
private int length;
public int compareTo(Stick o) { return this.length - o.length; }
}
// 方式二:傳入 Comparator
class Stone { private int volume; }
class MyComparator implements Comparator<Stone> {
public int compare(Stone s1, Stone s2) { return s1.getVolume() - s2.getVolume(); }
}
// 使用
new TreeSet<Stick>(); // 自然排序
new TreeSet<Stone>(new MyComparator()); // 定製排序
無論雜湊還是樹形存儲,元素都必須正確覆寫 equals()。 放入 HashSet/LinkedHashSet 時 hashCode() 必須一致。良好習慣:覆寫 equals() 時必須同步覆寫 hashCode()。
first() / last():獲取首尾元素subSet(from, to) / headSet(to) / tailSet(from):範圍視圖comparator():獲取比較器,null 表示自然排序| 實現類 | 底層結構 | 特點 | 順序 | 適用場景 |
|---|---|---|---|---|
| HashMap | 雜湊表 (JDK8+ 鏈表轉紅黑樹) | 查找/插入極快,取代 Hashtable | 無序 | 通用鍵值存儲首選 |
| LinkedHashMap | 雜湊表 + 雙向鏈表 | 迭代順序為插入順序或訪問順序 | 有序 | LRU 快取、需保持插入順序 |
| TreeMap | 紅黑樹 | Key 自動排序,範圍查詢 | 有序 | 需按 Key 排序遍歷 |
| Hashtable | 雜湊表 | 線程安全但效能低,已過時 | 無序 | 不建議使用,改用 ConcurrentHashMap |
Collection 介面中部分修改方法(如 add()、remove())被標記為「可選操作」。實現類若不支援,應拋出 UnsupportedOperationException。
設計考量:避免為「不可修改集合」、「只能新增集合」等細分需求定義大量介面,保持類庫簡潔。對多數標準實現類,所有操作均受支援;只有特殊視圖(如 Collections.unmodifiableList() 返回的視圖)會拋出此異常。