解決問題時,我們往往無法預知需要多少物件、它們的存活時間。陣列雖能儲存物件,但大小固定、操作僵化。集合(Collection,又稱容器)應運而生:它們本身也是物件,內部持有其他物件的參考,並能自動擴充容量,無需預先知道元素數量。
java.util)不同庫提供不同類型的集合:Vector(動態陣列)、LinkedList(鏈結串列)、HashSet、TreeMap、Queue、Stack 等,各有優勢,開發者可依需求選擇。
集合提供 add()、push() 等寫入方法,但讀取方式因實作而異。迭代器(Iterator)解決了這個問題:
Java 早期使用 Enumeration,1.2 版引入功能更強的 Iterator(支援移除操作等)。
Stack(LIFO)、Queue(FIFO)、Set(不重複)、List(有序)提供不同語意,依問題選擇。
以 Vector vs LinkedList 為例:
| 操作 | Vector(動態陣列) | LinkedList(鏈結串列) |
|---|---|---|
| 隨機存取 | O(1) 極快 | O(n) 需遍歷 |
| 中間插入/刪除 | O(n) 需搬移 | O(1) 僅調整指標 |
設計初期可先用 List 介面,效能調優時再具體化為 ArrayList 或 LinkedList,因迭代器抽象,程式碼幾乎無需修改。
在 StrSortVector 範例中,使用 sorted 標記:只有當真正需要讀取時才排序,避免每次 add() 都排序。這種「除非必要不計算」的策略稱為懶惰求值,同樣適用於初始化(懶惰初始化)。
集合與迭代器是 Java 處理動態資料的核心工具。善用介面導向設計、理解底層資料結構特性、靈活切換實作,是寫出高效、可維護程式的關鍵。