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

Java 5 新特性:增強型 for 循環 (for-each) 完整攻略

     編輯:Java 相關知識

語法與基本用法

for (元素型別 變數名 : 陣列或 Iterable) { 循環體 }

遍歷陣列

int[] nums = {1,2,3,4};
for (int n : nums) System.out.println(n); // 1 2 3 4

編譯器轉換為索引基礎迴圈,零效能損耗。

遍歷 Collection

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

編譯器轉換為 Iterator 迴圈。

設計考量:為什麼不用 foreach / in 關鍵字?

  • 相容性:in 常用作變數名 (如 System.in),新關鍵字會破壞既有程式碼。
  • 語法複雜度:上下文敏感關鍵字增加編譯器複雜度,Java 團隊選擇重用 for + :。

防止循環變數被意外修改

加上 final 修飾符,編譯期禁止對循環變數重新賦值:

for (final int n : nums) { n = n/2; // 編譯錯誤 }

但仍可呼叫方法改變物件內部狀態:

for (final Random r : randoms) { r.setSeed(4); /* 合法 */ }

型別相容規則

情境範例說明
型別完全相同int i : int[]最直接
元素型別為循環變數子型別Object o : List<String>向上轉型安全
自動裝箱/拆箱轉換Integer i : int[]JDK 5 Autoboxing 支援

注意:Object[] 元素型別固定為 Object,即使實際存放 String。

可被 for-each 遍歷的前提條件

  1. 陣列 (任何型別)。
  2. 實作 java.lang.Iterable<T> 介面的類別實例。

Iterable 介面定義

public interface Iterable {
    Iterator iterator();
}

Iterator 介面定義

public interface Iterator {
    boolean hasNext();
    E next();
    void remove(); // 選做,拋 UnsupportedOperationException 即可
}

自訂可遍歷類別範例

public class TenIntegers implements Iterable {
    public Iterator iterator() {
        return new Iterator() {
            private int count = 0;
            public boolean hasNext() { return count < 10; }
            public Integer next() { return Integer.valueOf(count++); }
            public void remove() { throw new UnsupportedOperationException(); }
        };
    }
    public static void main(String[] args) {
        for (int i : new TenIntegers()) System.out.println(i); // 0~9
    }
}

利用 Iterable<Integer> + Iterator<Integer> + next() 回傳 Integer,配合 Auto-Unboxing 讓 int 循環變數可用。

Collection 並無特權

Collection 介面繼承 Iterable,故所有 Collection 皆可遍歷。編譯器無特殊對待,任何實作 Iterable 的類別皆可。

命名慣例由來

  • iterator() 而非 getIterator():頻繁呼叫,短名稱提升可讀性。
  • hasNext()/next() 而非 hasNextElement()/getNextElement():同理,Collections Framework 設計者刻意簡化。

泛型與型別精確控制

  • 一個類別只能實作一次 Iterable<T> (不可 implements Iterable<String>, Iterable<Integer>)。
  • 若需支援多種循環變數型別,需提供不同方法 (如 stringIterator()) 或統一用 Object。

總結

  • 語法糖:編譯期展開為傳統迴圈,無執行期額外開銷。
  • 適用對象:陣列、Collection、任意 Iterable 實作類。
  • 搭配 final 防誤修改、泛型精確控制型別、自訂 Iterable 擴展性極佳。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved