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

Java 遍歷陣列與集合:for-each vs 傳統 for 迴圈選擇指南

     編輯:Java 相關知識

語法對比

// 傳統 for (索引)
for (int i = 0; i < arr.length; i++) {
    System.out.println(arr[i]);
}

// for-each (JDK 5+)
for (String s : list) {
    System.out.println(s);
}

適用對象

  • 陣列:T[]
  • 實作 Iterable<T> 的集合:List, Set, Queue...
  • 實作 Iterator<T> 的物件(需轉為 Iterable 或手動迭代)

for-each 優勢

  1. 語法簡潔:無索引變數、邊界條件、遞增邏輯,減少 off-by-one 錯誤。
  2. 唯讀語意:隱含「僅讀取元素」,防止誤修改集合結構(如迴圈中 list.remove() 拋 ConcurrentModificationException)。
  3. 效能相當或更好:JIT 編譯器對迭代器模式優化極佳,陣列甚至直接優化為索引存取。
  4. 統一介面:同一語法處理陣列、List、Set,程式碼更通用。

必須用傳統 for 的場景

  • 需要索引值:for (int i = 0; i < n; i++) process(i, arr[i])
  • 反向遍歷:for (int i = list.size()-1; i >= 0; i--)
  • 迴圈中修改集合結構:for (int i = 0; i < list.size(); i++) { if (cond) list.remove(i--); }
  • 步長不為 1:for (int i = 0; i < arr.length; i += 2)
  • 多重陣列平行遍歷:for (int i = 0; i < a.length; i++) use(a[i], b[i])

進階:Java 8+ Stream API


// 僅讀取、轉換、過濾
list.stream().filter(s -> s.length() > 3).forEach(System.out::println);

// 需要索引
IntStream.range(0, list.size())
    .forEach(i -> System.out.println(i + ":" + list.get(i)));

// 平行處理 (大數據量)
list.parallelStream().map(String::toUpperCase).collect(toList());

總結建議

場景推薦寫法
單純遍歷讀取元素for-each (最優先)
需要索引/反向/步長/修改結構傳統 for
函數式轉換/過濾/聚合Stream API
高效能平行處理parallelStream (謹慎評估)

原則:能用 for-each 就用 for-each,代碼更清晰、錯誤更少、效能不輸傳統迴圈。

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