在 Java 集合框架中,Iterable 與 Iterator 是遍歷機制的核心雙支柱。雖然名稱相似,但它們的設計目的、使用場景與內部機制有本質區別。本文從源碼層面深度剖析兩者差異。
| 特性 | Iterable | Iterator |
|---|---|---|
| 套件位置 | java.lang | java.util |
| 核心方法 | iterator() 返回新 Iterator | hasNext(), next(), remove() |
| 狀態保持 | 無狀態,每次調用返回全新迭代器 | 有狀態,維護當前遍歷位置指標 |
| 實作關係 | Collection 繼承 Iterable | 集合內部類實作 Iterator |
這是關鍵設計決策:
iterable.iterator() 都獲得獨立迭代器,互不干擾。支援同時對同一集合進行多次獨立遍歷。reset() 方法,自然獲得「從頭開始」的新迭代器。// ArrayList 實作 Iterable
public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, Serializable {
// 實作 Iterable 唯一方法
public Iterator<E> iterator() {
return new Itr(); // 返回內部類新實例
}
// 內部類實作 Iterator,維護 cursor 狀態
private class Itr implements Iterator<E> {
int cursor = 0;
int lastRet = -1;
// hasNext(), next(), remove() 依賴 cursor 狀態
}
}
語法糖 for (E e : collection) 編譯為:
for (Iterator<E> it = collection.iterator(); it.hasNext(); ) {
E e = it.next();
// 循環體
}
這證明增強型 for 依賴 Iterable.iterator() 而非直接依賴 Iterator。
Iterable<T>,提供 iterator() 即可支援增強型 forIteratoriterator.remove(),否則拋出 ConcurrentModificationExceptionIterable 是「可迭代」的語義契約,提供迭代器工廠方法;Iterator 是具體的「迭代器」實例,攜帶遍歷狀態。這種工廠模式設計保證了遍歷的線程安全性與多重並發能力,是 Java 集合框架優雅設計的典範。