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

Java 迭代器模式全解析:從原理到集合框架源碼剖析

     編輯:Java 相關知識

模式定義

迭代器模式:在不暴露集合內部結構的前提下,順序訪問集合元素。將遍歷邏輯從集合類中分離,符合單一職責原則。

兩種迭代器分類

類型適用集合特點
外部迭代器白箱集合(暴露內部結構)邏輯由集合提供,迭代器僅維護游標,常作內部類
內部迭代器黑箱集合(不暴露遍歷接口)迭代器為集合成員類,可直接訪問私有字段

手寫標準實現

1. 介面定義

public interface IteratorObj {
    void first();                    // 移至首元素
    boolean hasNextItem();           // 是否有下一個
    Object currentItem();            // 獲取當前元素並移動游標
}
public interface DataSet {
    IteratorObj getIterator();       // 工廠方法
}

2. 具體聚合與迭代器

public class Dataobj implements DataSet {
    private Object[] objArray;
    public Dataobj(Object[] arr) { this.objArray = arr; }
    @Override public IteratorObj getIterator() { return new Iterator1(this); }
    public Object getItem(int i) { return objArray[i]; }
    public int getSize() { return objArray.length; }
}

public class Iterator1 implements IteratorObj {
    private Dataobj set; private int size, index = 0;
    public Iterator1(Dataobj set) { this.set = set; this.size = set.getSize(); }
    @Override public void first() { index = 0; }
    @Override public boolean hasNextItem() { return index < size; }
    @Override public Object currentItem() {
        Object ob = set.getItem(index);
        if (index < size) index++;
        return ob;
    }
}

3. 客戶端使用

Dataobj ao = new Dataobj(new String[]{"12312","dasda","dasd"});
IteratorObj io = ao.getIterator();
while (io.hasNextItem()) System.out.println(io.currentItem());

JDK 集合框架中的應用

ArrayList 的內部迭代器 Itr

  • 實現 Iterator 介面的**非靜態內部類** → 直接訪問 elementData、size、modCount
  • Fail-Fast 機制:expectedModCount 記錄創建時修改次數,操作前檢查 modCount,不一致拋 ConcurrentModificationException
  • remove() 僅能刪除**最後遍歷**的元素,且更新 expectedModCount

ListIterator 增強功能

  • 雙向遍歷:hasPrevious()、previous()
  • 安全修改:add()、set()、remove() 均更新 expectedModCount
  • 定位索引:nextIndex()、previousIndex()

Enumeration vs Iterator

特性EnumerationIterator
刪除元素無 remove()支持 remove()
實現方式Vector.elements() 返回匿名類集合自行實現
Fail-Fast不支持支持
適用版本舊版 API (Vector/Hashtable)Collections 框架標準

總結

迭代器模式實現了遍歷邏輯與數據結構解耦。JDK 中 ArrayList.Itr 作為內部類體現「內部迭代器」優勢,modCount 機制保證並發修改時的快速失效。理解源碼有助於正確使用(如僅用迭代器 remove() 刪除、避免並發修改異常)。

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