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

Java for 迴圈演進:傳統寫法、增強型 for-each 與最佳實務

     編輯:Java 相關知識

傳統 for 迴圈 (Java 1.0+)


// 陣列
int[] numbers = {1, 2, 3, 4};
for (int i = 0; i < numbers.length; i++) {
    System.out.println(numbers[i]);
}

// Collection (需 Iterator)
String[] strs = {"A", "B", "C", "D"};
Collection list = Arrays.asList(strs);
for (Iterator it = list.iterator(); it.hasNext(); ) {
    System.out.println(it.next());
}

增強型 for-each 迴圈 (Java 5 / J2SE 1.5+)

// 陣列
for (int n : numbers) {
    System.out.println(n);
}

// Collection / Iterable
for (String s : list) {
    System.out.println(s);
}

編譯器轉換原理

  • 陣列:轉換為索引基礎的傳統 for 迴圈
  • Collection:轉換為 Iterator 基礎迴圈 (it.hasNext() / it.next())
  • **效能等同**,純語法糖,無額外開銷

自訂類別支援 for-each

實作 Iterable<T> 介面並提供 iterator() 方法:

public class MyContainer implements Iterable {
    private List items = new ArrayList<>();
    
    public void add(T item) { items.add(item); }
    
    @Override
    public Iterator iterator() {
        return items.iterator(); // 或自訂 Iterator 實作
    }
}

// 使用
var container = new MyContainer();
container.add("A");
container.add("B");
for (String s : container) { // 編譯器自動呼叫 iterator()
    System.out.println(s);
}

for-each 限制與注意事項

防止意外修改迴圈變數

for (final String s : list) {
    // s = "new"; // 編譯錯誤:無法指派 final 變數
    System.out.println(s);
}

加上 final 可在編譯期攔截重新指派,提升程式碼安全性。

現代替代:Stream API (Java 8+)

list.stream()
    .filter(s -> s.startsWith("A"))
    .forEach(System.out::println);

// 平行處理
list.parallelStream().forEach(System.out::println);

歷史小知識

  • for-each 概念源自 1979 年 Bourne Shell (for var in list; do ... done)
  • Java 選用 for (Type var : iterable) 而非 foreach/in 關鍵字,為**避免破壞相容性** (in 常作變數名如 System.in)

總結

  • 優先使用 for-each:可讀性高、不易出錯、效能相同
  • 需索引、需修改結構、複雜迴圈邏輯 → 傳統 for
  • 函數式風格、鏈式操作、平行處理 → Stream API
  • 自訂容器實作 Iterable 即可支援 for-each
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
限制說明
無索引存取需索引時請用傳統 for
無法移除元素需移除請用 Iterator.remove() 或串流 API
無法修改陣列/集合結構迴圈中增刪會拋 ConcurrentModificationException
迴圈變數為副本修改迴圈變數不影響原集合元素 (基本型別/參考傳值)