Java 深拷贝三维阵列

Java 深拷贝三维阵列,java,multidimensional-array,Java,Multidimensional Array,我很难理解复制的深度。我有一个我想复制的3d向量 int bands[][][] = new int[parameters.numberPredictionBands + 1][][]; int copy[][][] = new int [parameters.numberPredictionBands + 1][][]; 然后我将这个向量传递给一些改变频带的方法 prepareBands(bands); 最后,我需要创建一个带的深度副本,这样当副本更改时,带保持不变,反之亦然 copy =

我很难理解复制的深度。我有一个我想复制的3d向量

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;
}
private int[][]copyOf3Dim(int[][]array,int[]copy){
对于(intx=0;x
方法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;
}
private int[][]copyOf3Dim(int[][]array,int[]copy){
for(int i=0;i
方法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;
}    
public int[][]copyOf3Dim(int[][]array,int[]copy){
for(int i=0;i
我想我的程序在执行
array[I].length时崩溃了


你能告诉我我做错了什么吗

深度克隆的一个常用技巧是将对象序列化为一个
ByteArrayOutputStream
,然后立即反序列化它。它不是一个顶级的执行者,但它是一个简单的两行三行代码,工作到任何深度

数组恰好是可序列化的

final ByteArrayOutputStream out = new ByteArrayOutputStream();
new ObjectOutputStream(out).writeObject(array);
final Spec clone = (int[][][]) 
     new ObjectInputStream(new ByteArrayInputStream(out.toByteArray())).

我多次成功使用的深度克隆的一般技巧是将对象序列化为一个
ByteArrayOutputStream
,然后立即反序列化它。它不是一个顶级的执行者,但它是一个简单的两行三行代码,工作到任何深度

数组恰好是可序列化的

final ByteArrayOutputStream out = new ByteArrayOutputStream();
new ObjectOutputStream(out).writeObject(array);
final Spec clone = (int[][][]) 
     new ObjectInputStream(new ByteArrayInputStream(out.toByteArray())).

当数组[i]为空,即没有子数组时崩溃。当数组[i]为空,即没有子数组时崩溃。您能提供一个示例吗?我不太明白,你能举个例子吗?我不太明白