數組與集合是 Java 數據存儲的兩大基石。本文系統對比兩者差異,梳理集合體系架構,解析核心實現類特性與適用場景,並提供轉換實例與選型建議,助你精準選擇數據結構。
| 維度 | 數組 | 集合 |
|---|---|---|
| 大小 | 固定,創建時指定 | 動態可變,自動擴容 |
| 元素類型 | 單一類型(基本/引用) | 引用類型,可存異構對象(配合泛型約束) |
| 適用場景 | 數量確定、高性能隨機訪問 | 數量不定、頻繁增刪、複雜操作 |
互轉橋樑:`Collection.toArray()`、`Arrays.asList()`(注意返回固定長度 List)。
Collection
├── List(有序、可重複)
│ ├── ArrayList :數組實現,隨機訪問快,非線程安全
│ ├── LinkedList :鏈表實現,首尾增刪快,非線程安全
│ └── Vector :數組實現,線程安全(同步開銷大,已淘汰)
├── Set(無序、不可重複)
│ ├── HashSet :HashMap 底層,O(1) 查找,非線程安全
│ ├── LinkedHashSet:維護插入順序
│ └── TreeSet :紅黑樹實現,有序,O(log n)
Map(鍵值對、Key 唯一)
├── HashMap :數組+鏈表/紅黑樹,非線程安全,允許 null key/value
├── LinkedHashMap:維護插入/訪問順序
├── TreeMap :紅黑樹,Key 有序
└── Hashtable :線程安全,不允許 null,已淘汰(推薦 ConcurrentHashMap)
HashSetLinkedHashSetTreeSet// 良好實踐:聲明接口類型
List list = new ArrayList<>();
Map map = new HashMap<>();
// 切換實現零成本
List list2 = new LinkedList<>();
// 方法參數受益多態
public void process(List- items) { ... }
優勢:解耦具體實現、便於測試替換、支援泛型演算法複用。
int[] arr = {1, 2, 3};
String[] strs = {"aaa", "bbb"};
List list = new ArrayList<>();
List intList = new ArrayList<>();
List
| 需求 | 推薦結構 | 備註 |
|---|---|---|
| 高頻隨機訪問、少量增刪 | ArrayList | 預估大小用 `ensureCapacity` |
| 高頻頭尾增刪、隊列/棧 | LinkedList | 實現 Deque 接口 |
| Key-Value 快速查找、非線程安全 | HashMap | 預設負載因子 0.75 |
| Key-Value 高併發 | ConcurrentHashMap | JDK 8+ 無段鎖設計 |
| 去重、無序 | HashSet | 底層借用 HashMap |
| 去重、有序 | TreeSet | 實現 NavigableSet |
理解底層數據結構(動態數組、鏈表、紅黑樹、哈希表)是選型關鍵。堅持面向接口編程,優先使用非同步集合,併發場景轉用 `java.util.concurrent` 包專用類。數組與集合互轉時注意副本與視圖差異,避免意外修改共享數據。