有没有更有效的方法来复制多维度阵列(深层复制)?

时间:2015-01-18 02:06:05

标签: java

我将复制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);

2 个答案:

答案 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实现的,所以我不希望它显着更快(但它肯定不会更慢)。