基於JDK 1.4.2源碼分析(避開1.5泛型複雜度)。Collection介面核心方法語義精妙:
add(Object):回傳boolean不代表成功失敗(失敗拋異常),而是表示「集合內容是否發生變化」toArray()與toArray(Object[]):後者若參數陣列足夠大則填充並回傳同一陣列,否則建立新陣列;多餘位置補nulliterator():工廠方法回傳Iterator,核心遍歷入口無Iterator時,客戶端必須知道內部結構:
// 陣列遍歷
for(int i=0; i
緊耦合導致:更換ArrayList為LinkedList需重寫所有客戶端代碼。
統一遍歷邏輯:
for(Iterator it = c.iterator(); it.hasNext(); ) {
Object o = it.next();
// 處理元素...
}
核心洞見:遍歷狀態(當前位置、是否有下一個)由Iterator封裝維護,客戶端只控制Iterator發送「向前」、「取值」指令。集合類透過工廠方法生成專屬Iterator(ArrayList→ArrayIterator,TreeSet→TreeIterator),客戶端完全不關心具體類型,僅依賴Iterator介面——這是面向介面程式設計的經典體現。
public interface Iterator {
boolean hasNext();
Object next();
void remove(); // 可選操作
}
JDK 1.5引入for-each語法糖:for(Type t : c) { ... },編譯器自動轉換為Iterator模式,進一步簡化客戶端代碼。
AbstractList提供iterator()預設實現,內部類別Itr實現Iterator:
cursor(下一個元素索引)、lastRet(上次回傳索引)hasNext():cursor != size()next():檢查modCount偵測並發修改,回傳elementData[cursor++]remove():呼叫remove(lastRet),調整cursor、lastRet快速失效機制透過modCount實現,保護遍歷過程中集合結構不被意外修改。