在 Java 開發中,資料結構的選擇直接影響程式效能與維護性。早期開發者常面臨「物件多用集合存,資料多用陣列存」的抉擇。本文將從集合框架的演進脈絡出發,深度剖析集合與陣列的核心差異,協助你在實戰中做出最優選擇。
Java 初期僅提供陣列、Vector、Hashtable 等有限容器,且缺乏統一介面,導致程式碼耦合度高、擴充性差。隨著 JDK 1.2 推出 Collections Framework,統一了 List、Set、Map 等核心介面,並提供 ArrayList、LinkedList、HashSet、HashMap 等豐富實作,確立了「介面隔離、實作多態」的設計範式。
| 維度 | 陣列 | 集合 |
|---|---|---|
| 長度特性 | 固定長度,宣告後不可變 | 動態可變,自動擴容 |
| 元素型別 | 只能儲存單一型別(基本型別或物件引用) | 可儲存任意 Object 子型別,支援泛型約束 |
| 記憶體模型 | 連續記憶體區塊,存取速度極快 | 非連續記憶體,透過引用鏈結,略有額外開銷 |
| 功能豐富度 | 僅提供基本存取 | 內建排序、搜尋、迭代、串流等高階操作 |
Collection (介面)
├── List (有序、可重複)
│ ├── ArrayList (動態陣列,查詢快)
│ ├── LinkedList (雙向鏈表,增刪快)
│ └── Vector (執行緒安全,已淘汰)
├── Set (無序、不可重複)
│ ├── HashSet (HashMap 底層,效能最佳)
│ ├── LinkedHashSet (保持插入順序)
│ └── TreeSet (紅黑樹,自動排序)
└── Queue (佇列)
├── PriorityQueue (優先權佇列)
└── ArrayDeque (雙端佇列)
Map (介面,鍵值對)
├── HashMap (主流,JDK 1.8 引入紅黑樹優化)
├── LinkedHashMap (保持插入/存取順序)
├── TreeMap (有序 Map)
└── Hashtable / ConcurrentHashMap (執行緒安全)
ArrayListLinkedList 或 ArrayDequeHashSetHashMapLinkedHashMapConcurrentHashMap、CopyOnWriteArrayList集合框架以介面為核心,屏蔽底層資料結構細節,讓開發者專注業務邏輯。理解陣列與集合的底層機制、效能特徵,才能在海量資料、高併發場景下寫出高效穩健的 Java 程式碼。