java for-each上的行为不一致

and*_*and 0 java foreach

考虑以下代码:

class Jm44 {

public static void main(String args[]){

      int []arr = {1,2,3,4};
      for ( int i : arr )
      {
         arr[i] = 0;
       }

      for ( int i : arr )
      {
         System.out.println(i);
      }


     }

}
Run Code Online (Sandbox Code Playgroud)

它打印:

0 
0 
3 
0
Run Code Online (Sandbox Code Playgroud)

这是什么?For-each应该运行在数组中的所有元素,为什么它会运行arr[3]=0但不会arr[2]=0

Esk*_*ola 26

如果你看看arr第一个循环中发生了什么,它就变得很明显了.

    int[] arr = {1, 2, 3, 4};
    for (int i : arr) {
        System.out.println("i = " + i);
        arr[i] = 0;
        System.out.println("arr = " + Arrays.toString(arr));
    }

    for (int i : arr) {
        System.out.println(i);
    }
Run Code Online (Sandbox Code Playgroud)

这打印:

i = 1
arr = [1, 0, 3, 4]
i = 0
arr = [0, 0, 3, 4]
i = 3
arr = [0, 0, 3, 0]
i = 0
arr = [0, 0, 3, 0]
0
0
3
0

您正在使用数组中的值作为索引来修改数组中的值."foreach"循环遍历数组的,而不是数组的索引.删除语法糖后,这是你的foreach循环实际上是:

    int[] arr = {1, 2, 3, 4};
    for (int index = 0; index < arr.length; index++) {
        int i = arr[index];
        arr[i] = 0;
    }

    for (int i : arr) {
        System.out.println(i);
    }
Run Code Online (Sandbox Code Playgroud)

为了能够索引数组,您需要使用传统的for循环,如下所示:

    int[] arr = {1, 2, 3, 4};
    for (int i = 0; i < arr.length; i++) {
        arr[i] = 0;
    }

    for (int i : arr) {
        System.out.println(i);
    }
Run Code Online (Sandbox Code Playgroud)


Car*_*ter 8

int []arr = {1,2,3,4};
      for ( int i : arr )
      {
         arr[i] = 0;
       }
Run Code Online (Sandbox Code Playgroud)

在调试器中观察arr.

1,2,3,4 (initially)
1,0,3,4 (after we change arr[arr[0]], or arr[1])
0,0,3,4 (after we change arr[arr[1]], or arr[0])
0,0,3,0 (after we change arr[arr[2]], or arr[3])
0,0,3,0 (after we change arr[arr[3]], or arr[0] (no change, actually) 
Run Code Online (Sandbox Code Playgroud)