gpt4 book ai didi

java - 为什么 int 矩阵不是不可变的?

转载 作者:行者123 更新时间:2023-12-01 10:06:33 24 4
gpt4 key购买 nike

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

最佳答案

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 循环,一切都会正常工作。

关于java - 为什么 int 矩阵不是不可变的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36414266/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com