for (元素類型 變數 : 數組或集合) {
// 變數依次取得每個元素
}
String[] books = {"Java", "C", "C++", "C#", "ASP"};
for (String book : books) {
System.out.println(book);
}
// 輸出每個書名
for (String book : books) {
book = "Hello"; // 僅修改區域變數引用
}
System.out.println(books[0]); // 仍輸出 "Java"
原因:foreach 實質上使用迭代器,變數是元素副本 (引用副本),重新賦值不影響原陣列/集合。
| 場景 | 建議 | 替代方案 |
|---|---|---|
| 唯讀遍歷、打印、累加 | ✅ foreach | - |
| 需修改元素值 | ❌ | 索引 for / ListIterator.set |
| 需刪除元素 | ❌ (拋 ConcurrentModificationException) | Iterator.remove / removeIf |
| 需索引 (如插入、比較相鄰) | ❌ | 索引 for |
| 多維數組 | ✅ 巢狀 foreach | - |
// 等價轉換
for (String book : books) { ... }
// ↓ 編譯器轉換為
for (int i = 0; i < books.length; i++) {
String book = books[i];
...
}
// 集合轉換為 Iterator
for (String s : list) { ... }
// ↓
for (Iterator it = list.iterator(); it.hasNext(); ) {
String s = it.next();
...
}
books.forEach(System.out::println);
// 或
books.forEach(book -> System.out.println(book.toUpperCase()));
// 配合 Stream 過濾轉換
Arrays.stream(books)
.filter(b -> b.startsWith("C"))
.forEach(System.out::println);
parallelStream() + forEach (注意線程安全)。int[]) 同樣支援 foreach,自動拆箱裝箱無額外開銷。