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

Java Iterator 與 Enumeration 深度對比:Fail-Fast、效能與遷移指南

     編輯:Java 相關知識

一、介面定義對比

特性Enumeration (JDK 1.0)Iterator (JDK 1.2+)
方法hasMoreElements(), nextElement()hasNext(), next(), remove()
修改支援唯讀可刪除當前元素
Fail-Fast不支援支援(modCount 機制)
適用集合Vector、Hashtable 等舊類所有 Collection 實作
命名風格冗長簡潔

二、Fail-Fast 機制原理

// 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())。

三、效能實測:Hashtable 遍歷

Hashtable table = 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 物件。

四、遷移最佳實踐

  • 新代碼全面使用 Iterator(或增強 for / Stream),Enumeration 僅維護舊系統。
  • Collections.list(enumeration) 可快速轉 List 再用 Iterator。
  • 需併發安全遍歷:用 CopyOnWriteArrayList、ConcurrentHashMap(弱一致性 Iterator)、或加鎖。
  • 單線程刪除:iterator.remove(),禁止 list.remove()。

五、原碼級差異:遍歷順序

  • HashMap Iterator:陣列索引 0→N,鏈表/樹頭→尾。
  • Hashtable Enumeration/Iterator:陣列索引 N→0,鏈表頭→尾(歷史包袱)。

六、總結

Enumeration = 歷史遺產,唯讀、無 Fail-Fast、略快;
Iterator = 現代標準,可刪除、Fail-Fast 安全、通用性強。
新項目無理由使用 Enumeration。

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