java兩種常用for迴圈的區別
阿新 • • 發佈:2018-12-06
先看程式:
public class Test {
public static void main(String[] args) throws Exception{
int[] arr = {1,2,3};
printArr(arr);
for(int i : arr){
i = 5;
}
printArr(arr);
for(int i=0; i<arr.length; ++i){
arr[i] = 5;
}
printArr(arr);
}
public static void printArr(int[] arr){
for(int i : arr){
System.out.print(i + ", ");
}
System.out.println();
}
}
輸出為:
1, 2, 3,
1, 2, 3,
5, 5, 5,
第一種for(:)
迴圈形式,編譯器會把陣列元素複製到臨時變數i中,i是陣列元素的副本並非陣列元素本身。所以對i的修改不會造成陣列元素的改變。為了防止這種難以理解的程式碼的出現,可以用如下形式的程式碼防止對i進行修改操作出現:
for(final int i : arr){...}
如果陣列(或者集合)的元素是引用,則for迴圈中臨時變數是陣列(或集合)中引用的副本。雖然是引用副本,但是對其指向的物件的修改還是會影響到陣列(或集合)中引用指向的物件,如下:
public class Test {
public int i;
public Test(int i){
this.i = i;
}
public String toString(){
return "Test: " + i;
}
public static void main(String[] args) throws Exception{
ArrayList<Test> tArr = new ArrayList<Test>();
tArr.add(new Test(1));
tArr.add(new Test(2));
tArr.add(new Test(3));
System.out.println(tArr);
for(Test t: tArr){
t.i = 5;
}
System.out.println(tArr);
}
}
輸出為:
[Test: 1, Test: 2, Test: 3]
[Test: 5, Test: 5, Test: 5]