在Java中深度克隆多维数组......? [复制]

Posted

技术标签:

【中文标题】在Java中深度克隆多维数组......? [复制]【英文标题】:Deep cloning multidimensional arrays in Java...? [duplicate] 【发布时间】:2010-09-17 01:19:42 【问题描述】:

我有两个具有推断大小的多维数组(实际上它们只是 2D)。如何深度克隆它们?到目前为止,这是我得到的:

public foo(Character[][] original)
    clone = new Character[original.length][];
    for(int i = 0; i < original.length; i++)
          clone[i] = (Character[]) original[i].clone();

相等性测试original.equals(clone); 吐出一个错误。为什么? :|

【问题讨论】:

【参考方案1】:

与@Barak 解决方案(序列化和反序列化)相同,带有示例(因为有些人无法理解并投反对票)

public static <T extends Serializable> T deepCopy(T obj)

    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    try
    
        ObjectOutputStream oos = new ObjectOutputStream(baos);

        // Beware, this can throw java.io.NotSerializableException 
        // if any object inside obj is not Serializable
        oos.writeObject(obj);  
        ObjectInputStream ois = new ObjectInputStream(
                                    new ByteArrayInputStream(baos.toByteArray()));
        return (T) ois.readObject();
    
    catch (  ClassNotFoundException /* Not sure */
           | IOException /* Never happens as we are not writing to disc */ e)
    
        throw new RuntimeException(e); // Your own custom exception
    

用法:

    int[][] intArr =   1  ;
    System.out.println(Arrays.deepToString(intArr)); // prints: [[1]]
    int[][] intDc = deepCopy(intArr);
    intDc[0][0] = 2;
    System.out.println(Arrays.deepToString(intArr)); // prints: [[1]]
    System.out.println(Arrays.deepToString(intDc)); // prints: [[2]]
    int[][] intClone = intArr.clone();
    intClone[0][0] = 4;

    // original array modified because builtin cloning is shallow 
    System.out.println(Arrays.deepToString(intArr)); // prints: [[4]]
    System.out.println(Arrays.deepToString(intClone)); // prints: [[4]]

    short[][][] shortArr =    2   ;
    System.out.println(Arrays.deepToString(shortArr)); // prints: [[[2]]]

    // deepCopy() works for any type of array of any dimension
    short[][][] shortDc = deepCopy(shortArr);
    shortDc[0][0][0] = 4;
    System.out.println(Arrays.deepToString(shortArr)); // prints: [[[2]]]
    System.out.println(Arrays.deepToString(shortDc)); // prints: [[[4]]]

【讨论】:

【参考方案2】:
/**Creates an independent copy(clone) of the boolean array.
 * @param array The array to be cloned.
 * @return An independent 'deep' structure clone of the array.
 */
public static boolean[][] clone2DArray(boolean[][] array) 
    int rows=array.length ;
    //int rowIs=array[0].length ;

    //clone the 'shallow' structure of array
    boolean[][] newArray =(boolean[][]) array.clone();
    //clone the 'deep' structure of array
    for(int row=0;row<rows;row++)
        newArray[row]=(boolean[]) array[row].clone();
    

    return newArray;

【讨论】:

【参考方案3】:

我在jGuru 上找到了克隆多维数组的答案:

ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(this);
ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bais);
Object deepCopy = ois.readObject();

【讨论】:

这种技术适用于多维数组。只需使用array 代替this【参考方案4】:

平等测试 original.equals(克隆);吐出一个 错误的。为什么? :|

那是因为您正在使用new Character[original.length][]; 创建一个新数组。

Arrays.deepEquals(original,clone) 应该返回 true。

【讨论】:

【参考方案5】: 数组上的

equals() 方法是在 Object 类中声明的方法。这意味着它只会在对象相同的情况下返回 true。相同的意思是在CONTENT中不一样,但在MEMORY中相同。因此,当您在内存中复制结构时,数组上的 equals() 将永远不会返回 true。

【讨论】:

【参考方案6】:

您可能想查看java.util.Arrays.deepEquals 和java.util.Arrays.equals 方法。

恐怕数组对象的equals 方法执行浅比较,并且不能正确(至少在这种情况下)比较内部Character 数组。

【讨论】:

以上是关于在Java中深度克隆多维数组......? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

在java中,如何复制一个对象?比如说string对象

关于数组的深度克隆(未完待续)

在多维数组java中沿方向移动数字

克隆数组

使用Jquery在多维数组中增加键名

反射实现java深度克隆