Java通用数组深层复制和克隆通用对象

时间:2018-07-29 21:18:45

标签: java arrays generics clone

我想对n维原始数组进行深层复制。

public static double[] deepCopy(double[] arr) {
    return arr.clone();
}

public static double[][] deepCopy(double[][] arr) {
    arr = arr.clone();
    for (int i = 0; i < arr.length; i++) {
        arr[i] = deepCopy(arr[i]);
    }
    return arr;
}

public static double[][][] deepCopy(double[][][] arr) {
    arr = arr.clone();
    for (int i = 0; i < arr.length; i++) {
        arr[i] = deepCopy(arr[i]);
    }
    return arr;
}

以上是用于深度复制1、2和3维双精度数组的代码。我想归纳为任何原始类型和/或归纳为数组的维数。我都想要,但是我知道用Java不可能完成很多事情,因此,如果您只能获得一个,或者告诉我为什么它不起作用,那是可以的。

谢谢!

1 个答案:

答案 0 :(得分:2)

要深度复制多维数组,请使用以下代码。

请注意,这只是 array 值的深层副本,而不是数组中任何非数组值,因此该副本仅对于多维基本数组真正深。对于多维对象数组,它是浅层的。

声明的数组类型无关紧要。例如。 Object[][]可以包含数组对象,使其(部分)成为3D数组。这些第三维数组也将被复制。

该方法将复制一维对象数组,但不会复制一维基本数组。要复制一维基本数组,请使用clone()

@SuppressWarnings("unchecked")
public static <T> T[] deepCopyArray(T[] array) {
    return (T[]) deepCopyArrayInternal(array);
}
private static Object deepCopyArrayInternal(Object array) {
    int length = Array.getLength(array);
    Object copy = Array.newInstance(array.getClass().getComponentType(), length);
    for (int i = 0; i < length; i++) {
        Object value = Array.get(array, i);
        if (value != null && value.getClass().isArray())
            value = deepCopyArrayInternal(value);
        Array.set(copy, i, value);
    }
    return copy;
}