先看程序:
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]