在数组上调用clone()是否也克隆其内容?

如果我对types为A的Object的数组调用clone()方法,它将如何克隆它的元素? 该副本是否引用相同的对象? 或者它会为它们中的每(element of type A).clone()调用(element of type A).clone()

clone()创build一个浅拷贝。 这意味着元素将不会被克隆。 (如果他们没有实现Cloneable呢?)

您可能希望使用Arrays.copyOf(..)来复制数组而不是clone() (尽pipe克隆对于数组来说很好,不像其他任何东西)

如果你想深入克隆, 请检查这个答案


一个小例子来说明clone()的浅薄性,即使元素是Cloneable

 ArrayList[] array = new ArrayList[] {new ArrayList(), new ArrayList()}; ArrayList[] clone = array.clone(); for (int i = 0; i < clone.length; i ++) { System.out.println(System.identityHashCode(array[i])); System.out.println(System.identityHashCode(clone[i])); System.out.println(System.identityHashCode(array[i].clone())); System.out.println("-----"); } 

打印:

 4384790 4384790 9634993 ----- 1641745 1641745 11077203 ----- 

如果我对types为A的Object的数组调用clone()方法,它将如何克隆它的元素?

数组的元素不会被克隆。

该副本是否引用相同的对象?

是。

或者它会为它们中的每一个调用(typesA的元素).clone()?

不,它不会在任何元素上调用clone()

一维基元数组在克隆时复制元素。 这诱使我们克隆二维数组(arrays数组)。

请记住,由于clone()浅拷贝实现,二维数组克隆不起作用。

 public static void main(String[] args) { int row1[] = {0,1,2,3}; int row2[] = row1.clone(); row2[0] = 10; System.out.println(row1[0] == row2[0]); // prints false int table1[][]={{0,1,2,3},{11,12,13,14}}; int table2[][] = table1.clone(); table2[0][0] = 100; System.out.println(table1[0][0] == table2[0][0]); //prints true } 

克隆是数组的浅表副本。

这个testing代码打印:

 [1,2] / [1,2]
 [100,200] / [100,2]

因为MutableInteger在两个数组中共享为objects[0]objects2[0] ,但您可以独立于objects[1]更改引用objects[1] objects2[1]

 import java.util.Arrays; public class CloneTest { static class MutableInteger { int value; MutableInteger(int value) { this.value = value; } @Override public String toString() { return Integer.toString(value); } } public static void main(String[] args) { MutableInteger[] objects = new MutableInteger[] { new MutableInteger(1), new MutableInteger(2) }; MutableInteger[] objects2 = objects.clone(); System.out.println(Arrays.toString(objects) + " / " + Arrays.toString(objects2)); objects[0].value = 100; objects[1] = new MutableInteger(200); System.out.println(Arrays.toString(objects) + " / " + Arrays.toString(objects2)); } }