再學Java 之 foreach迴圈

scutwang發表於2014-04-30

  從Java 5 之後,Java提供了一種新的迴圈:foreach迴圈,這種迴圈遍歷陣列和集合更加簡潔。

foreach迴圈語法格式如下:

for ( type variableName : array | collection){
    //variableName自動迭代訪問每個元素
}

 

  在很多書籍中,都能找到這麼一句話“使用foreach迴圈迭代陣列元素時,並不能改變陣列元素”。如:

String books = {"a","b","c"};
//使用foreach遍歷,然後賦予新的值
foreach ( String book : books ){
    book = "d";
}

//重新輸出,發現輸出的依然是:a , b , c ,
foreach ( String book : books ){
    System.out.print(book+" , ");
}

 

  然而這句話其實並不對。

  我們都知道,foreach迴圈中,variableName就相當於是一個臨時變數,系統依次將陣列元素賦給這個臨時變數,而對這個元素進行賦值,並不影響原陣列;

  事實上,這一個臨時變數類似於函式方法的引數,假如該變數是基本型別,則對該臨時變數進行操作不會影響到原陣列;但是,假如該變數是引用變數,則對該變數進行操作,會影響到原陣列。

如:

public class Run_main {
    
    public static void main(String[] args){
        A[] arr = {new A(),new A(),new A()};
        for (A a : arr) {
            System.out.println(a.a);
        }
        for (A a : arr) {
            a.a = 2;
        }
      //輸出為 2, 2,  2
        for (A a : arr) {
            System.out.println(a.a);
        }
        
    }
}

class A{
    public int a= 12;
}

在上面的程式中,由於陣列的元素是引用變數,所以,對類A的例項進a.a = 2 的賦值操作會影響到原陣列。

 

總結:foreach迴圈中的臨時變數可以與方法中的引數進行類比,當該變數為基本型別,則對其操作,不影響原陣列;假如為引用變數,就是將陣列元素的引用地址賦予該臨時變數,那麼對該臨時變數的操作將會影響原陣列。

相關文章