如果我在A类对象数组上调用clone()
方法,它将如何克隆其元素?该副本是否会引用相同的对象?或者它会为每个人打电话(element of type A).clone()
吗?
答案 0 :(得分:76)
clone()
创建一个浅表副本。这意味着不会克隆元素。 (如果他们没有实施Cloneable
怎么办?)
您可能希望使用Arrays.copyOf(..)
来复制数组而不是clone()
(尽管克隆适用于数组,与其他任何内容不同)
如果您想深度克隆,check this answer
一个小例子来说明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
-----
答案 1 :(得分:19)
如果我在类型A的对象数组上调用clone()方法,它将如何 克隆其元素?
不会克隆数组的元素。
副本是否会引用相同的对象?
是
或者它会为每个人调用(类型A的元素).clone()吗?
不,它不会在任何元素上调用clone()
。
答案 2 :(得分:6)
1D基元数组在克隆时会复制元素。这诱使我们克隆2D数组(数组数组)。
请记住,由于clone()
的浅拷贝实现,2D数组克隆无法正常工作。
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
}
答案 3 :(得分:5)
克隆是数组的浅表副本。
此测试代码打印:
[1, 2] / [1, 2] [100, 200] / [100, 2]
因为MutableInteger
在两个数组中共享为objects[0]
和objects2[0]
,但您可以独立于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));
}
}