1. 程式人生 > >java兩種常用for迴圈的區別

java兩種常用for迴圈的區別

先看程式:

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]