为什么int矩阵不是一成不变的?

时间:2016-04-04 22:49:42

标签: java matrix foreach mutable

我的印象是原始数据值是不可变的,因此无法更改(专注于增强的for循环),这就解释了为什么此代码无法正常工作:

//Not Mutable Primitaves
    int[] arr = new int[4];
    arr[0] = 1;
    arr[1] = 2;
    arr[2] = 3;
    arr[3] = 4;

    for(int i : arr){
        i = i*2;
    }

    for(int i = 0; i < arr.length; i++){
        System.out.print(arr[i] + ",");
    }

    System.out.print("\n");

本规范继续打印1,2,3,4,无论乘数如何。但是在这段代码中,增强的for循环实际上修改了原始矩阵,但我不明白为什么?

    public static void changeArr(int[] arr, int mult){
        for(int i = 0; i < arr.length; i++){
            arr[i] = arr[i] * mult;
        }
    }

    public static void main(){
    int[][] matrix = new int [3][3];

    for (int i = 0; i<matrix.length; i++){
        for (int j = 0; j<matrix[i].length; j++){
            matrix[i][j] = i;
        } 
    }

    for (int[] row : matrix){
        changeArr(row, 1);
    }

    for (int i = 0; i<matrix.length; i++){
        for (int j = 0; j<matrix[i].length; j++){
            System.out.print(matrix[i][j] + ",");
        } 
        System.out.print("\n");
    }
    }

有人可以帮助澄清为什么这适用于矩阵但不适用于阵列?

修改的 执行arr [i]会使程序崩溃,例如:

    arr[0] = 1243;
    arr[1] = 21;
    arr[2] = 354;
    arr[3] = 4123;

1 个答案:

答案 0 :(得分:1)

for(int i : arr){
    i = i*2;
}

相当于

for (int index = 0; index < arr.length; index++) {
   int i = arr[index];
   i = i * 2;
}

......正如你所看到的那样,什么也没做。相比之下,对于二维数组,你得到的是

 for (int index = 0; index < matrix.length; index++) {
   int[] row = matrix[index];
   changeArr(row, 1);
 }

因为row是对同一对象的引用而起作用。

如果您尝试设置row = newRow,那将同样无效,但您可以修改行的内容

使用普通的索引for循环,一切都会正常工作。