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

Java for 循環寫法全總結:傳統索引、增強 for、Lambda 與 final 修飾最佳實踐

     編輯:Java 相關知識

三種核心寫法對比

寫法語法適用對象優點缺點
傳統 forfor (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 循環深度解析

語法糖本質

// 源碼
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
}

Collection 遍歷範例

List<String> list = Arrays.asList("A", "B", "C", "D");
for (String s : list) {
    System.out.println(s); // A B C D
}

final 修飾循環變數:防止誤賦值

for (final int i : integers) {
    i = i / 2; // 編譯錯誤:變數不可修改
}
  • 只禁止**變數重新賦值**,不禁止**修改物件內部狀態**
  • 建議:增強 for 循環變數**默認加 final**
// 允許修改物件狀態
for (final Random r : randoms) {
    r.setSeed(4); // OK:修改物件內部狀態
    System.out.println(r.nextLong());
}

類型相容規則

循環變數類型可為:

  1. **元素類型本身**
  2. **元素類型的父類/介面**
  3. **可自動裝箱/拆箱轉換的類型** (如 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; ... }

JDK 8+ Lambda 遍歷

// 外部迭代
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);

最佳實踐建議

  1. **只讀遍歷** → 優先 增強 for 或 Lambda
  2. **需索引/修改結構** → 傳統 for 或 Iterator
  3. **複雜邏輯/鏈式操作** → Stream API
  4. **增強 for 變數加 final** → 避免誤賦值 Bug
  5. **避免在增強 for 中移除元素** → 拋 ConcurrentModificationException,改用 Iterator.remove() 或 removeIf()

for-each 歷史小知識

  • 1979 年 Bourne Shell 已有 for var in list; do ... done
  • Java 用 : 而非 in,避免 in 作為關鍵字衝突 (如 System.in)
  • 關鍵字 foreach 同理,為兼容性未引入
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved