使用 Java foreach 遇到的问题

本来以为使用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循环吧:

扫描二维码关注公众号,回复: 3656228 查看本文章
    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

猜你喜欢

转载自blog.csdn.net/lintax/article/details/54985083