克隆一维数组和二维数组时发生的情况有所不同

时间:2013-12-20 05:15:30

标签: java arrays clone

我首先克隆了1D原始数组(它将保存包装器)然后更改克隆数组的第一个值。但是原始数组的第一个值没有改变。然后我克隆了一个2D数组并做了同样的事情。(更改了数组[0] [0]值)。其值为originalArray [0] [0]也被更改了。为什么会这样。这是由于浅拷贝和深拷贝吗?

我的一维数组示例

    int[] arr=new int[2];
    arr[0]=1;
    arr[1]=2;

    int[]arrnew=arr.clone();
    System.out.println(arr[0]);
    System.out.println(arrnew[0]);
    arr[0]=5;
    System.out.println(arr[0]);
    System.out.println(arrnew[0]);

我的2D数组示例

        int[][] arr=new int[2][2];
        arr[0][0]=1;
        arr[0][1]=2;
        arr[1][0]=3;
        arr[1][1]=4;
        int[][] arrnew=arr.clone();
        System.out.println(arr[1][0]);
        System.out.println(arrnew[1][0]);
        arr[1][0]=5;
        System.out.println(arr[1][0]);
        System.out.println(arrnew[1][0]); 

2 个答案:

答案 0 :(得分:4)

  

这是由于浅拷贝和深拷贝吗?

是。 clone()仅执行浅拷贝。

clone方法复制第一个维度的内容。在第一个示例中,数组只有1维,由整数(值类型)组成,因此复制了所有整数。这仍然是一个浅薄的副本。如果您使用数组中的引用类型创建相同的示例,您将看到与多维数组相同的行为。

在第二个例子中,你有一个二维数组,它基本上是一个数组数组,所以“第一个数组”包含引用。克隆多维数组时,将复制对数组的引用,而不是这些数组的内容(因为它不是深层副本)。

答案 1 :(得分:0)

更改int[][] arrnew=arr.clone(); to int[][] arrnew=(int[][]) arr.clone();
它的行为与1D阵列的情况相同