我最近偶然发现了一个通过引用另一个数组传递二维数组的问题。
假设我们有一个 multiArray(A) 并且我们创建了一个类似的 multiArray(B)。出于某种原因,似乎 B 中的更改会自动应用于 A。
我查看了其他帖子,其中提到了克隆数组的想法,但仍然没有用。我还创建了 multiArrays 的多个实例并将其分配给原始实例。即使那样,我的第二个数组(我想与原始数组相同但又独立于原始数组)总是碰巧影响原始数组。
因此,我如何才能使我的第二个数组的引用与我的数组相同但独立于我的原始数组,这样我的第二个数组的更改不会影响我的第一个?
这里是问题的一些示例代码(您可以假设 board 类也是 Square multiArray,之前在某处定义):
编辑:我创建了一个新的 Square MultiArray 并逐个元素复制,但引用问题仍然存在。
Square [][] board2 = new Square[3][3];
for(int i = 0; i < board2.length; i++){
for(int j = 0; j < board2[0].length; j++)
board2[i][j] = board[i][j];
}
try {
for (int i = 0; i < board.length; i++) {
if (board[i][0].isEmpty() && board[i][1].isEmpty() && board[i][2].isEmpty()) {
board[i][0].Empty();
board[i][1].Empty();
board[i][2].Empty();
}
}
} catch (IndexOutOfBoundsException e) {}
try {
for (int j = 0; j < board2.length; j++) {
if (board2[0][j].isEmpty() && board2[1][j].isEmpty() && board2[2][j].isEmpty()) {
System.out.println("weird this should not happen");
board2[0][j].Empty();
board2[1][j].Empty();
board2[2][j].Empty();
}
}
} catch (IndexOutOfBoundsException e) {}
感谢任何帮助 贾
您遇到的行为是引用一般工作方式的影响。具有相同引用的两个变量将指向内存中的相同数据,因此修改该内存会影响您从任何持有相同引用的变量中获得的值。这也适用于嵌套数组。
因此,我如何才能使我的第二个数组的引用与我的数组相同但独立于我的原始数组,这样我的第二个数组的更改不会影响我的第一个?
这是不可能的,因为传播变化是引用作为一个整体的行为。您需要按照 this answer 中的描述深入克隆数组,以获得具有相同内容的全新数组,并克隆
Square
实例,使那些实例也独立于原始数组。