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

Java 增強 for 循環(for-each)深度解析:語法糖、類型兼容與性能真相

     編輯:Java 程式設計入門

從傳統到增強:遍歷的進化

傳統寫法回顧

// 數組
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());
}

JDK 5 引入的增強 for 循環

// 語法: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];
    ...
}

Collection 還原

// 源碼
for (String s : list) { ... }

// 編譯器生成
for (Iterator $it = list.iterator(); $it.hasNext(); ) {
    String s = $it.next();
    ...
}

為什麼不用 foreach / in 關鍵字?

  1. 兼容性:新關鍵字會破壞舊代碼(如變量名 in 極常見)
  2. 語法複雜度:上下文敏感關鍵字增加解析器複雜度
  3. 歷史傳承:Bourne Shell (1979) 已用 for ... in ... do ... done

進階特性與陷阱

1. final 禁止循環變量重賦值

for (final int n : arr) {
    n = 10; // ❌ 編譯錯誤
}
// 但可修改對象內部狀態
for (final Random r : randoms) {
    r.setSeed(42); // ✅ 允許
}

2. 類型兼容規則(三種合法情況)

規則說明示例
同類型循環變量類型 = 元素類型int n : int[], String s : List<String>
父類型循環變量類型是元素類型父類Object o : List<String>, int n : byte[]
自動拆裝箱基本類型 ⇄ 包裝類型Integer i : int[], byte b : List<Byte>

3. 元素類型由容器聲明決定


Object[] objArr = new String[]{"A","B"};
for (String s : objArr) { ... } // ❌ 編譯錯誤!數組聲明類型是 Object[]
for (Object o : objArr) { ... } // ✅

泛型與增強 for 的完美配合


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)
  • 數組(基本類型、引用類型)
  • 不適用:需索引操作、反向遍歷、刪除元素(需顯式 Iterator)

總結

增強 for 是編譯期語法糖,本質是 Iterator/索引循環的簡寫。理解其類型兼容規則、final 語義、不適用場景,能寫出更簡潔、安全的遍歷代碼。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved