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]

猜你喜欢

转载自blog.csdn.net/xuejianbest/article/details/84823293