Try   HackMD

For-each照妖鏡

tags: NTU-CE Computer Programming Java Programming Language

解釋for-each和傳統for loop的差別。

用for列舉array有兩種方式

以下用範例說明這兩種用法要注意的事情

public class Test {
    public static void main(String[] args) {
        int[] numbers = { 1, 2, 3 };             
        for (Integer e : numbers) { // Enhanced for loop (for-each)
            System.out.print(e + " ");
            e = e * 2;
        }
        System.out.print("\n");                
        for (int i = 0; i < numbers.length; i++) { // What does for-each exactly do...
            Integer e = numbers[i];
            System.out.print(e + " ");
            e = e * 2;
        }
        System.out.print("\n");                
        for (int i = 0; i < numbers.length; i++) { // Traditional for loop
            System.out.print(numbers[i] + " ");
        }
        System.out.print("\n");
        for (int i = 0; i < numbers.length; i++) { // Traditional for loop for changing elements in array
            numbers[i] = numbers[i] * 2;
            System.out.print(numbers[i] + " ");
        }
    }
}

首先要分辨e跟numbers的元素是不是存在電腦裡的相同記憶體位址?
若不是,當我們操作e就無法改變到numbers裡的元素了。
在範例裡面:
第一個迴圈是enhanced for loop的用法。
第二個迴圈是把第一個迴圈打回原貌。
我們看第三個迴圈印出來的東西,可以知道foreach改變不了numbers,於是我們用第四個迴圈才能達到我們真正想要的操作 。

結論

如果是只想要「取出」陣列裡的值,把它們印出來或是存到別的變數裡,就可以用for-each;如果要「改變」陣列裡的值,就必須用傳統的for loop寫法。