运行上面的代码时,与我的意图相反,arrayMaster以及arrayChanges都发生了变化。
线
static private int[][] arrayChanges = arrayMaster;
是罪魁祸首。该行指向
arrayChanges并
arrayMaster指向同一对象,因此当您从任一对象访问该对象时,都可以看到对任一对象的更改。
编辑:每当您克隆多维数组的一个维度时会发生什么
正如Eric
Lippert解释的那样,数组在概念上是变量列表。如果仅分配另一个变量以指向la相同的数组
staticprivate int[][] arrayChanges =arrayMaster;,则根本不会更改变量集。除了之外
arrayChanges,您没有创建任何新变量,因此您没有从操作系统/
JVM中获得更多的内存,因此您所做的任何更改都将
arrayMaster应用于该变量,
arrayChanges反之亦然。
现在让我们看一个二维数组。在Java中,二维数组是一列变量的列表,这些变量恰好具有这些变量中的每个变量都指向一维数组的属性。因此,每当克隆一个二维数组时,都会创建一个新的变量列表,每个变量都指向旧变量所指向的相同位置。因此,您获得了一些
arrayChanges[0]= newint[10]好处
arrayMaster,可以安全地编写而不影响,但是一旦开始引用,
arrayChanges[i][j]您仍在引用与该引用相同的第二级数组
arrayMaster。要深度复制一个int的二维数组,您真正想要的是
public static int[][] deepCopyIntMatrix(int[][] input) { if (input == null) return null; int[][] result = new int[input.length][]; for (int r = 0; r < input.length; r++) { result[r] = input[r].clone(); } return result;}对于那些将来可能会看这个答案的人:是的,最好
int用
T这里代替并使该方法通用,但是为此目的,更具体的深度复制方法更易于解释。



