迭代器模式提供一種方法順序訪問聚合對象中的各個元素,而又不暴露該對象的內部表示。其核心價值在於:將遍歷邏輯從集合類中分離出來,實現集合與遍歷行為的解耦。
// 迭代器介面
interface Iterator<E> {
boolean hasNext();
E next();
void remove(); // 可選操作
}
// 聚合介面
interface Container<E> {
Iterator<E> iterator();
void add(E e);
void remove(E e);
E get(int index);
}
// 具體聚合類
class ActualContainer<E> implements Container<E> {
private List<E> list = new ArrayList<>();
@Override
public void add(E e) { list.add(e); }
@Override
public void remove(E e) { list.remove(e); }
@Override
public E get(int index) {
return (index >= 0 && index < list.size()) ? list.get(index) : null;
}
@Override
public Iterator<E> iterator() {
return new ActualIterator();
}
// 內部類實現迭代器
private class ActualIterator implements Iterator<E> {
private int cursor = 0;
@Override
public boolean hasNext() {
return cursor < list.size();
}
@Override
public E next() {
if (!hasNext()) throw new NoSuchElementException();
return list.get(cursor++);
}
@Override
public void remove() {
if (cursor == 0) throw new IllegalStateException();
list.remove(--cursor);
}
}
}
// 客戶端測試
public class Demo {
public static void main(String[] args) {
ActualContainer<Integer> container = new ActualContainer<>();
for (int i = 5; i < 20; i++) container.add(i);
Iterator<Integer> it = container.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
}
}
Java 集合框架完美應用了迭代器模式:
Collection 繼承 Iterable,強制實現 iterator()ArrayList 通過內部類 Itr 實現快速失效迭代器HashMap 通過 EntryIterator 遍歷鍵值對| 特性 | 快速失效 | 安全失效 |
|---|---|---|
| 代表 | ArrayList、HashMap | CopyOnWriteArrayList、ConcurrentHashMap |
| 原理 | modCount 機制檢測結構性修改 | 遍歷時複製底層數據 |
| 併發性能 | 低 | 高(讀多寫少場景) |
| 內存開銷 | 小 | 大 |