迭代器模式:在不暴露集合內部結構的前提下,順序訪問集合元素。將遍歷邏輯從集合類中分離,符合單一職責原則。
| 類型 | 適用集合 | 特點 |
|---|---|---|
| 外部迭代器 | 白箱集合(暴露內部結構) | 邏輯由集合提供,迭代器僅維護游標,常作內部類 |
| 內部迭代器 | 黑箱集合(不暴露遍歷接口) | 迭代器為集合成員類,可直接訪問私有字段 |
public interface IteratorObj {
void first(); // 移至首元素
boolean hasNextItem(); // 是否有下一個
Object currentItem(); // 獲取當前元素並移動游標
}
public interface DataSet {
IteratorObj getIterator(); // 工廠方法
}
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;
}
}
Dataobj ao = new Dataobj(new String[]{"12312","dasda","dasd"});
IteratorObj io = ao.getIterator();
while (io.hasNextItem()) System.out.println(io.currentItem());
ItrIterator 介面的**非靜態內部類** → 直接訪問 elementData、size、modCountexpectedModCount 記錄創建時修改次數,操作前檢查 modCount,不一致拋 ConcurrentModificationExceptionremove() 僅能刪除**最後遍歷**的元素,且更新 expectedModCounthasPrevious()、previous()add()、set()、remove() 均更新 expectedModCountnextIndex()、previousIndex()| 特性 | Enumeration | Iterator |
|---|---|---|
| 刪除元素 | 無 remove() | 支持 remove() |
| 實現方式 | Vector.elements() 返回匿名類 | 集合自行實現 |
| Fail-Fast | 不支持 | 支持 |
| 適用版本 | 舊版 API (Vector/Hashtable) | Collections 框架標準 |
迭代器模式實現了遍歷邏輯與數據結構解耦。JDK 中 ArrayList.Itr 作為內部類體現「內部迭代器」優勢,modCount 機制保證並發修改時的快速失效。理解源碼有助於正確使用(如僅用迭代器 remove() 刪除、避免並發修改異常)。