// 數組
int[] arr = {1,2,3,4};
for (int i = 0; i < arr.length; i++) { System.out.println(arr[i]); }
// Collection
Collection list = Arrays.asList("A","B","C","D");
for (Iterator it = list.iterator(); it.hasNext(); ) {
System.out.println(it.next());
}
// 語法:for (元素類型 變量名 : 可迭代對象)
for (int n : arr) { System.out.println(n); }
for (String s : list) { System.out.println(s); }
增強 for 在編譯期被還原為傳統迭代器/索引循環,零性能損耗。
// 源碼
for (int n : integers) { ... }
// 編譯器生成 (變量名為編譯器自動生成)
for (int $i = 0; $i < integers.length; $i++) {
int n = integers[$i];
...
}
// 源碼
for (String s : list) { ... }
// 編譯器生成
for (Iterator $it = list.iterator(); $it.hasNext(); ) {
String s = $it.next();
...
}
in 極常見)for ... in ... do ... donefor (final int n : arr) {
n = 10; // ❌ 編譯錯誤
}
// 但可修改對象內部狀態
for (final Random r : randoms) {
r.setSeed(42); // ✅ 允許
}
| 規則 | 說明 | 示例 |
|---|---|---|
| 同類型 | 循環變量類型 = 元素類型 | int n : int[], String s : List<String> |
| 父類型 | 循環變量類型是元素類型父類 | Object o : List<String>, int n : byte[] |
| 自動拆裝箱 | 基本類型 ⇄ 包裝類型 | Integer i : int[], byte b : List<Byte> |
Object[] objArr = new String[]{"A","B"};
for (String s : objArr) { ... } // ❌ 編譯錯誤!數組聲明類型是 Object[]
for (Object o : objArr) { ... } // ✅
List list = new ArrayList<>();
list.add("A"); list.add("B");
for (String s : list) { // 無需強轉,類型安全
System.out.println(s.length());
}
JDK 5 同步引入泛型與增強 for,前者提供編譯期類型信息,後者消費該信息,實現無強轉、類型安全的遍歷。
Iterable<T> 接口的類(所有 Collection)增強 for 是編譯期語法糖,本質是 Iterator/索引循環的簡寫。理解其類型兼容規則、final 語義、不適用場景,能寫出更簡潔、安全的遍歷代碼。