首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 程式設計入門

Java源碼深度解析:Iterator模式在集合框架中的實現藝術

     編輯:Java 程式設計入門

集合框架根介面:Collection

基於JDK 1.4.2源碼分析(避開1.5泛型複雜度)。Collection介面核心方法語義精妙:

  • add(Object):回傳boolean不代表成功失敗(失敗拋異常),而是表示「集合內容是否發生變化」
  • toArray()與toArray(Object[]):後者若參數陣列足夠大則填充並回傳同一陣列,否則建立新陣列;多餘位置補null
  • iterator():工廠方法回傳Iterator,核心遍歷入口

為什麼需要Iterator模式?

無Iterator時,客戶端必須知道內部結構:

// 陣列遍歷
for(int i=0; i

緊耦合導致:更換ArrayList為LinkedList需重寫所有客戶端代碼。

Iterator模式解耦藝術

統一遍歷邏輯:

for(Iterator it = c.iterator(); it.hasNext(); ) {
    Object o = it.next();
    // 處理元素...
}

核心洞見:遍歷狀態(當前位置、是否有下一個)由Iterator封裝維護,客戶端只控制Iterator發送「向前」、「取值」指令。集合類透過工廠方法生成專屬Iterator(ArrayList→ArrayIterator,TreeSet→TreeIterator),客戶端完全不關心具體類型,僅依賴Iterator介面——這是面向介面程式設計的經典體現。

Iterator介面與JDK 1.5增強

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實現,保護遍歷過程中集合結構不被意外修改。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved