何時使用集合類
當需要組織「數量不確定、需迭代處理」的一組數據時,優先考慮集合而非數組。
三大接口核心區別
| 接口 | 特徵 | 典型實現 | 適用場景 |
| List | 有序、可重復、按索引訪問 | ArrayList、LinkedList | 需保持插入順序、按位置操作、允許重複(如購物車商品列表) |
| Set | 無序、唯一(不重復) | HashSet、LinkedHashSet、TreeSet | 去重、成員資格測試(如已登錄用戶 ID 集合、字典詞彙) |
| Map | 鍵值對、鍵唯一、值可重復 | HashMap、LinkedHashMap、TreeMap | 鍵值映射查找(如 ID→用戶對象、單詞→詞頻、配置鍵→值) |
選擇決策樹
- 需要「鍵 → 值」快速查找? → Map(`HashMap` 一般場景,`TreeMap` 需排序鍵)。
- 只需存儲元素,要求唯一? → Set(`HashSet` 一般,`LinkedHashSet` 保持插入序,`TreeSet` 自動排序)。
- 需保持順序、允許重複、按索引取? → List(`ArrayList` 隨機訪問快,`LinkedList` 頻繁頭尾增刪)。
使用注意事項
- 泛型:始終指定類型參數(`List`),編譯期類型安全。
- 初始容量:大致知數據量時預設 `new ArrayList<>(100)` 減少擴容開銷。
- 並發:多線程環境用 `Collections.synchronizedList` 或 `CopyOnWriteArrayList` / `ConcurrentHashMap`。
- 空值:`HashMap`/`HashSet` 允許一個 null key/元素;`TreeMap`/`TreeSet` 不允許 null key。
- 遍歷修改:迭代器中 `remove()` 安全,直接 `list.remove()` 拋 `ConcurrentModificationException`。
總結
List、Set、Map 是 Java 集合框架三大支柱。理解「有序/無序、可重復/唯一、索引/鍵」三個維度差異,按業務語義選擇即可。