| 特性 | Enumeration (JDK 1.0) | Iterator (JDK 1.2+) |
|---|---|---|
| 方法 | hasMoreElements(), nextElement() | hasNext(), next(), remove() |
| 修改支援 | 唯讀 | 可刪除當前元素 |
| Fail-Fast | 不支援 | 支援(modCount 機制) |
| 適用集合 | Vector、Hashtable 等舊類 | 所有 Collection 實作 |
| 命名風格 | 冗長 | 簡潔 |
// ArrayList 內部
private transient int modCount = 0;
public void add(E e) {
modCount++; // 結構性修改遞增
// ...
}
// Iterator 內部
final int expectedModCount = modCount;
public E next() {
if (modCount != expectedModCount)
throw new ConcurrentModificationException(); // 快速失敗
// ...
}
觸發條件:多線程並發修改、單線程中迭代過程中直接呼叫 list.add/remove(需用 iterator.remove())。
Hashtabletable = new Hashtable<>(); for (int i = 0; i < 100_000; i++) table.put(String.valueOf(i), i); // Iterator long t1 = System.currentTimeMillis(); for (Iterator > it = table.entrySet().iterator(); it.hasNext(); ) it.next(); System.out.println("Iterator: " + (System.currentTimeMillis() - t1) + "ms"); // Enumeration long t2 = System.currentTimeMillis(); for (Enumeration en = table.elements(); en.hasMoreElements(); ) en.nextElement(); System.out.println("Enumeration: " + (System.currentTimeMillis() - t2) + "ms");
典型結果:Enumeration 略快(約 1.5~2 倍),原因:Iterator 額外維護 expectedModCount、檢查併發、包裝 Entry 物件。
Collections.list(enumeration) 可快速轉 List 再用 Iterator。CopyOnWriteArrayList、ConcurrentHashMap(弱一致性 Iterator)、或加鎖。iterator.remove(),禁止 list.remove()。Enumeration = 歷史遺產,唯讀、無 Fail-Fast、略快;
Iterator = 現代標準,可刪除、Fail-Fast 安全、通用性強。
新項目無理由使用 Enumeration。