| 寫法 | 語法 | 適用對象 | 優點 | 缺點 |
|---|---|---|---|---|
| 傳統 for | for (int i=0; i<len; i++) | 陣列、List、可索引集合 | 可控制索引、可修改集合結構 | 冗長、易越界 |
| 增強 for (for-each) | for (Type var : collection) | 陣列、Iterable、Collection | 簡潔、無索引錯誤、唯讀安全 | 無索引、不可移除元素 |
| Lambda/Stream (JDK8+) | list.forEach(e -> ...) | Collection、Stream | 函數式、可鏈式操作、並行流 | 調試難、非最終變數限制 |
// 源碼
for (int i : integers) { ... }
// 編譯後等價於
for (int i = 0; i < integers.length; i++) {
int val = integers[i];
...
}
// Collection 等價於
for (Iterator it = list.iterator(); it.hasNext(); ) {
Object val = it.next();
...
}
**無效能損耗**,編譯期自動轉換。
int[] integers = {1, 2, 3, 4};
for (int i : integers) {
System.out.println(i); // 1 2 3 4
}
List<String> list = Arrays.asList("A", "B", "C", "D");
for (String s : list) {
System.out.println(s); // A B C D
}
for (final int i : integers) {
i = i / 2; // 編譯錯誤:變數不可修改
}
// 允許修改物件狀態
for (final Random r : randoms) {
r.setSeed(4); // OK:修改物件內部狀態
System.out.println(r.nextLong());
}
循環變數類型可為:
Integer ↔ int)// 父類型
List<String> list = ...;
for (Object o : list) { ... } // OK
// 自動拆箱
int[] arr = {1,2,3};
for (Integer i : arr) { ... } // OK: int → Integer 自動裝箱
Object[] arr = new String[]{"A", "B"};
for (String s : arr) { ... } // 編譯錯誤!陣列類型是 Object[],元素類型視為 Object
// 必須
for (Object o : arr) { String s = (String) o; ... }
// 外部迭代
list.forEach(s -> System.out.println(s));
// 方法引用
list.forEach(System.out::println);
// 並行處理
list.parallelStream().forEach(s -> process(s));
// 配合 Stream 鏈式操作
list.stream()
.filter(s -> s.length() > 2)
.map(String::toUpperCase)
.forEach(System.out::println);
ConcurrentModificationException,改用 Iterator.remove() 或 removeIf()for var in list; do ... done: 而非 in,避免 in 作為關鍵字衝突 (如 System.in)foreach 同理,為兼容性未引入