我在理解深度复制的工作原理时遇到了问题。我有这个三维矢量,我想复制。
int bands[][][] = new int[parameters.numberPredictionBands + 1][][];
int copy[][][] = new int [parameters.numberPredictionBands + 1][][];
然后我把这个向量传递给一些改变波段的方法
prepareBands(bands);
最后,我需要创建一个乐队的深度复制,所以当复制发生变化时,乐队保持不变,反之亦然。
copy = copyOf3Dim(bands, copy);
我试过这些不同的方法,但它们似乎不适合我
方法1:
private int[][][] copyOf3Dim(int[][][] array, int[][][]copy) {
for (int x = 0; x < array.length; x++) {
for (int y = 0; y < array[0].length; y++) {
for (int z = 0; z < array[0][0].length; z++) {
copy[x][y][z] = array[x][y][z];
}
}
}
return copy;
}
方法2:
private int[][][] copyOf3Dim(int[][][] array, int[][][]copy) {
for (int i = 0; i < array.length; i++) {
copy[i] = new int[array[i].length][];
for (int j = 0; j < array[i].length; j++) {
copy[i][j] = Arrays.copyOf(array[i][j], array[i][j].length);
}
}
return copy;
}
方法3:
public int[][][] copyOf3Dim(int[][][] array, int[][][] copy) {
for (int i = 0; i < array.length; i++) {
copy[i] = new int[array[i].length][];
for (int j = 0; j < array[i].length; j++) {
copy[i][j] = new int[array[i][j].length];
System.arraycopy(array[i][j], 0, copy[i][j], 0, array[i][j].length);
}
}
return copy;
}
我认为我的程序在执行array[i].length
时崩溃
你能告诉我我可能做错了什么吗?
我已经成功地使用过多次的深度克隆的一个通用技巧是将对象序列化为ByteArrayOutputStream
,然后立即对其进行反序列化。它不是一个顶级的执行器,但它是一个简单的两三行代码,适用于任何深度。
数组恰好是Serializable
。
final ByteArrayOutputStream out = new ByteArrayOutputStream();
new ObjectOutputStream(out).writeObject(array);
final Spec clone = (int[][][])
new ObjectInputStream(new ByteArrayInputStream(out.toByteArray())).