有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我的印象是,原始数据值是不可变的,因此无法更改(重点是增强的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) 个答案

  1. # 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,这同样不会起任何作用,但您可以很好地修改行的内容

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