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

Java List 與 Map 遍歷方式完整指南:Iterator、for-each 與傳統 for 迴圈比較

     編輯:Java 相關知識

前言

在 Java 開發中,集合遍歷是最基礎也最常用的操作之一。無論是處理業務邏輯、資料轉換還是效能調優,選擇正確的遍歷方式都能事半功倍。本文將系統整理 List 與 Map 的主流遍歷寫法,並從語法、適用場景、效能等維度進行對比,幫助你在實際專案中做出最佳選擇。

一、List 三大遍歷方式詳解

以 ArrayList<String> 為例,裝載 5 筆測試資料:

1. Iterator 迭代器模式

@Test
public void iteratorTraverse() {
    List<String> list = new ArrayList<>();
    list.add("1"); list.add("2"); list.add("3"); list.add("4"); list.add("5");

    for (Iterator<String> it = list.iterator(); it.hasNext(); ) {
        String val = it.next();
        System.out.println("Iterator: " + val);
    }
}
  • 優點:不需要知道集合大小與具體實現類型,通用性最強;支援遍歷過程中安全移除元素(it.remove())。
  • 缺點:程式碼較冗長,Java 5 之後逐漸被 for-each 取代。

2. for-each(增強型 for 迴圈)

@Test
public void forEachTraverse() {
    List<String> list = new ArrayList<>();
    list.add("1"); list.add("2"); list.add("3"); list.add("4"); list.add("5");

    for (String val : list) {
        System.out.println("for-each: " + val);
    }
}
  • 優點:語法簡潔、可讀性高,編譯器自動轉換為 Iterator,效能等同。
  • 缺點:無法獲取索引,無法在遍歷中修改集合結構(會拋 ConcurrentModificationException)。

3. 傳統 for 迴圈(索引存取)

@Test
public void classicForTraverse() {
    List<String> list = new ArrayList<>();
    list.add("1"); list.add("2"); list.add("3"); list.add("4"); list.add("5");

    for (int i = 0; i < list.size(); i++) {
        System.out.println("classic for: " + list.get(i));
    }
}
  • 優點:可精確控制索引,支援逆序、跳躍等複雜邏輯;對 ArrayList 等隨機存取結構效能最優。
  • 缺點:對 LinkedList 效能極差(get(i) 為 O(n)),需自行管理邊界條件。

二、Map 四大遍歷方式詳解

以 HashMap<String, String> 為例:

1. keySet + for-each(最常見但非最優)

for (String key : map.keySet()) {
    String val = map.get(key);
    System.out.println("keySet: key=" + key + ", value=" + val);
}
  • 需額外呼叫 get(key),涉及兩次雜湊查找,效能較差。

2. entrySet + Iterator(手動控制)

for (Iterator<Map.Entry<String, String>> it = map.entrySet().iterator(); it.hasNext(); ) {
    Map.Entry<String, String> entry = it.next();
    System.out.println("entrySet-Iterator: " + entry.getKey() + "=" + entry.getValue());
}
  • 適用於需在遍歷中 remove() 的場景。

3. entrySet + for-each(推薦通用寫法)

for (Map.Entry<String, String> entry : map.entrySet()) {
    System.out.println("entrySet-forEach: " + entry.getKey() + "=" + entry.getValue());
}
  • 單次查找即可同時取得 key/value,效能最佳,語法清晰,推薦作為預設選擇。

4. values() 僅遍歷值

for (String val : map.values()) {
    System.out.println("values-only: " + val);
}
  • 完全不需要 key 時使用,避免建立 Entry 物件,略微節省記憶體。

三、效能與選型建議總結表

集合類型推薦方式適用場景避坑提醒
ArrayListfor-each / 傳統 for順序讀取、需索引運算遍歷中勿修改結構
LinkedListfor-each / Iterator順序讀取、頻繁增刪嚴禁傳統 for + get(i)
HashMap / LinkedHashMapentrySet + for-each同時需 key/valuekeySet+get 效能較差
TreeMapentrySet + for-each需有序遍歷同 HashMap

四、Java 8+ 現代寫法補充

若專案已升級至 Java 8,可善用 Stream API 與 forEach:

// List
list.forEach(System.out::println);

// Map
map.forEach((k, v) -> System.out.println(k + "=" + v));
// 或平行流處理大量資料
map.entrySet().parallelStream().forEach(entry -> { /* 處理邏輯 */ });

Stream 提供鏈式操作(filter、map、collect 等),適合複雜資料管線;但簡單遍歷仍以 for-each 為主,避免過度設計。

五、結語

遍歷看似微不足道,卻貫穿整個系統的讀寫路徑。掌握各集合的最佳遍歷姿勢,不僅能寫出更乾淨的程式碼,更能在高併發、大資料量場景下避免效能陷阱。建議將「List 用 for-each,Map 用 entrySet」作為肌肉記憶,特殊場景再視需求調整。

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