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