J2SE 5.0 引入增強型 for 迴圈(for-each),簡化陣列與 `Collection` 遍歷,並支援實作 `Iterable` 介面的自訂類別。
基本語法
for (元素型別 變數 : 陣列或Collection) {
// 處理變數
}
陣列與 Collection 範例
int[] nums = {1,2,3,4};
for (int n : nums) System.out.println(n);
List list = Arrays.asList("A","B","C");
for (String s : list) System.out.println(s);
編譯器轉換原理
陣列:轉為索引迴圈 `for (int i=0; iCollection:轉為迭代器迴圈 `for (Iterator it = c.iterator(); it.hasNext(); ) { T e = it.next(); ... }`
實作 Iterable 讓自訂類別支援 for-each
public class MyRange implements Iterable {
private final int start, end;
public MyRange(int start, int end) { this.start=start; this.end=end; }
@Override public Iterator iterator() {
return new Iterator<>() {
int current = start;
public boolean hasNext() { return current <= end; }
public Integer next() { return current++; }
};
}
}
// 使用
for (int i : new MyRange(1,5)) System.out.print(i + " "); // 1 2 3 4 5
常見陷阱與注意事項
- 無法直接修改集合結構(增/刪),需使用 `Iterator.remove()` 或並發集合
- 基本型別陣列會自動裝箱,產生額外物件,效能敏感場合建議用索引迴圈
- 迴圈變數作用域僅限迴圈內,避免外部誤用
- 對 `Map` 需遍歷 `entrySet()`、`keySet()` 或 `values()`