在数组上调用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)); } }