我将复制int [][]
数组,如下所示:
int [][] intArray={{1,2},{1,2,3},{3,5}};
int [][] intArrayBak=new int[3][];
System.arraycopy(intArray,0,intArrayBak,0,intArray.length);
intArrayBak[2][1]=100;
for(int i=0;i<intArray.length;i++)
{
for(int j=0;j<intArray[i].length;j++)
System.out.println(intArray[i][j]+" ");
System.out.println();
}
结果显示intArray [2] [1]也改为100.我想做一个深层复制。
除了for循环之外还有更有效的方法如下:
for (int i=0;i<intArray.length;i++)
System.arraycopy(intArray[i],0,intArrayBak[i],0,intArray[i].length);
答案 0 :(得分:0)
我会根据Arrays.copyOf()
:
public static int[][] deepCopy(int[][] array) {
int[][] result = Arrays.copyOf(array, array.length); // shallow
for (int i = 0; i < array.length; i++)
result[i] = Arrays.copyOf(array[i], array[i].length);
return result;
}
您可以保证JDK库方法的实现尽可能高效。
答案 1 :(得分:0)
由于Java不能连续存储2d阵列,因此无法避免循环遍历第一维并分别复制每个子阵列。
请注意System.arraycopy
期望分配目标,因此您必须先分配新数组。使用java.util.Arrays#copyOf
是比System.arraycopy
更简单的界面:
for (int i=0;i<intArray.length;i++)
intArrayBak[i]=Arrays.copyOf(intArray[i],intArray[i].length);
更详细的替代方案是:
// fixed arraycopy example
for (int i=0;i<intArray.length;i++) {
intArrayBak[i] = new int[intArray[i].length]; // zeroing
System.arraycopy(intArray[i],0,intArrayBak[i],0,intArray[i].length);
}
我更喜欢copyOf版本,因为它更具可读性。在内部,它是通过System.arraycopy
实现的,所以我不希望它显着更快(但它肯定不会更慢)。