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

Java 集合遍歷:Enumeration 與 Iterator 深度解析與效能比較

     編輯:Java 相關知識

集合遍歷兩大介面:Enumeration 與 Iterator 的前世今生

在 Java 集合框架中,Enumeration 與 Iterator 是兩種核心遍歷介面。雖然功能相似,但設計理念、功能豐富度與現代適用性有顯著差異。本文深入剖析兩者差異、效能表現與最佳實踐。

程式碼實戰:Hashtable 遍歷四種方式效能測試

import java.util.Enumeration;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.Map.Entry;

public class TraverseHashtable {
    public static void main(String[] args) {
        // 初始化 10,000 筆測試資料
        Hashtable<String, String> ht = new Hashtable<>();
        for (int i = 0; i < 10000; i++) {
            ht.put("Key=" + i, "Val=" + i);
        }

        // 1. Enumeration 遍歷 keys
        long start = System.currentTimeMillis();
        Enumeration<String> enKeys = ht.keys();
        while (enKeys.hasMoreElements()) {
            enKeys.nextElement();
        }
        System.out.println("Enumeration keys 耗時:" + (System.currentTimeMillis() - start) + " ms");

        // 2. Enumeration 遍歷 elements (值)
        start = System.currentTimeMillis();
        Enumeration<String> enElements = ht.elements();
        while (enElements.hasMoreElements()) {
            enElements.nextElement();
        }
        System.out.println("Enumeration elements 耗時:" + (System.currentTimeMillis() - start) + " ms");

        // 3. Iterator 遍歷 keySet
        start = System.currentTimeMillis();
        Iterator<String> itKeys = ht.keySet().iterator();
        while (itKeys.hasNext()) {
            itKeys.next();
        }
        System.out.println("Iterator keySet 耗時:" + (System.currentTimeMillis() - start) + " ms");

        // 4. Iterator 遍歷 entrySet (鍵值對)
        start = System.currentTimeMillis();
        Iterator<Entry<String, String>> itEntries = ht.entrySet().iterator();
        while (itEntries.hasNext()) {
            itEntries.next();
        }
        System.out.println("Iterator entrySet 耗時:" + (System.currentTimeMillis() - start) + " ms");
    }
}

核心差異詳細比較

維度EnumerationIterator
推出版本JDK 1.0 (古老)JDK 1.2 (集合框架標準)
核心方法hasMoreElements(), nextElement()hasNext(), next(), remove()
移除支援❌ 無法移除元素✅ 支援安全移除
泛型支援JDK 1.5 後添加原生支援泛型
適用集合Vector、Hashtable 等舊類所有 Collection 實作類
故障快速機制❌ 無✅ fail-fast 機制

效能真相:隨資料量增長差異趨近

早期傳言「Enumeration 效能優於 Iterator」,實測發現:

  • 小資料量 (百筆內):Enumeration 略快,因結構簡單
  • 中大量資料 (萬筆以上):兩者效能差異可忽略,JVM 優化使差距收斂
  • 現代 JVM:Iterator 經過大量優化,在大多數場景不遜於 Enumeration

結論: 不要為了微乎其微的效能差異選擇 Enumeration,功能缺失風險更大。

為何現代開發棄用 Enumeration?

  1. 功能不足: 缺乏 remove(),無法在遍歷中安全刪除
  2. 通用性差: 僅適用於 Vector、Hashtable 等舊類,無法遍歷 ArrayList、HashMap 等主流集合
  3. 無故障快速保護: 並發修改時不會拋出 ConcurrentModificationException,隱患難發現
  4. 代碼規範: Java 官方文檔明確建議新代碼使用 Iterator

唯一保留 Enumeration 的場景

維護極舊版系統 (JDK 1.1 時代) 或被迫呼叫舊版 API 回傳 Enumeration 時,為相容性不得不使用。新專案零理由使用。

最佳實踐建議

  • 優先使用 Iterator: 通用、安全、功能完整
  • 遍歷 Map 時: 推薦 entrySet().iterator(),單次遍歷同時獲取鍵值,效能最佳
  • Java 8+ 風格: 考慮 forEach、Stream API 等函數式寫法,更簡潔
  • 並發環境: 使用 ConcurrentHashMap 等並發集合,其 Iterator 為弱一致性,無拋異常風險

掌握遍歷介面的演進歷史與核心差異,能讓你在代碼審查、效能調優、舊系統重構時做出專業判斷。

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