本来以为使用foreach就和使用for循环是一样的效果,结果,却遇到了意料之外的事情。
先来看一个例子:
public void testArray() {
//定义一个一维数组
int arr[] = {1,3,2,4};
System.out.println("----输出刚刚定义的数组----");
for (int x : arr) {
System.out.println(x);
}
//通过索引给数组元素赋值
System.out.println("----通过foreach循环修改数组元素的值----");
for (int x : arr) {
x *= 2;
System.out.println(x);
}
//循环输出创建的数组
System.out.println("----修改后,foreach重新输出数组元素的值----");
for (int x : arr) {
System.out.println(x);
}
}
运行出来的结果:
----输出刚刚定义的数组----
1
3
2
4
----通过foreach循环修改数组元素的值----
2
6
4
8
----修改后,foreach重新输出数组元素的值----
1
3
2
4
咦,怎么没有修改过来?
网上查找答案,这个说得比较明白:
https://www.zhihu.com/question/36905481
给你举一个例子,你看一下可能比较能理解:
for(int element:array1){//question:为什么用Foreach无法给数组赋值。
element = r.nextInt(101)+1;
System.out.println(element);
}//虽然可以输出十个随机数,但并没有把十个随机数赋给array1数组。
这其中的执行过程是这样的
element = array1[i]
element = 随机数
syso(element)
element是个基本数据类型,他不指向数组元素的地址,他只代表数字他自己。
当理解了这个例子,你现在就应该知道foreach这东西的限制了。那就是不能修改数组元素,为什么呢?因为每一次loop你只是获得了当前元素的值,却没有获得当前元素在数组中的对象句柄。这样你就无法直接操作对应的句柄。
所以当你想遍历数组并只想获得元素值的时候才用foreach。其他的时候比如想修改数组,或者想获得index的时候就别用foreach。
现在,我们是想修改数组的值,那么就不能使用foreach了,还是使用for循环吧:
public void testArray1() {
//定义一个一维数组
int arr[] = {1,3,2,4};
System.out.println("----输出刚刚定义的数组----");
for (int x : arr) {
System.out.println(x);
}
//通过索引给数组元素赋值
System.out.println("----通过循环变量给数组元素赋值----");
for (int i = 0; i < arr.length; i++) {
arr[i] *= 2;
System.out.println(arr[i]);
}
//循环输出创建的数组
System.out.println("----修改后,foreach重新输出数组元素的值----");
for (int x : arr) {
System.out.println(x);
}
}
运行结果如下:
----输出刚刚定义的数组----
1
3
2
4
----通过循环变量给数组元素赋值----
2
6
4
8
----修改后,foreach重新输出数组元素的值----
2
6
4
8
长吁一口气,终于恢复正常了。
参考:
http://www.cnblogs.com/hnrainll/archive/2011/11/13/2247422.html
https://www.zhihu.com/question/36905481