如果我clone()在类型A的对象数组上调用方法,它将如何克隆其元素?该副本是否会引用相同的对象?或者它会(element of type A).clone()为每个人打电话吗?
Boz*_*zho 76
clone()创建一个浅表副本.这意味着不会克隆元素.(如果他们没有实施Cloneable怎么办?)
您可能希望Arrays.copyOf(..)用于复制数组而不是clone()(尽管克隆适用于数组,不像其他任何东西)
如果您想深度克隆,请查看此答案
一个小例子来说明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("-----");
}
Run Code Online (Sandbox Code Playgroud)
打印:
4384790
4384790
9634993
-----
1641745
1641745
11077203
-----
Run Code Online (Sandbox Code Playgroud)
Blu*_*zee 19
如果我在类型A的对象数组上调用clone()方法,它将如何克隆其元素?
不会克隆数组的元素.
该副本是否会引用相同的对象?
是.
或者它会为每个人调用(类型A的元素).clone()吗?
不,它不会调用clone()任何元素.
1D基元数组在克隆时会复制元素.这诱使我们克隆2D数组(数组数组).
请记住,由于浅拷贝实现,2D阵列克隆不起作用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
}
Run Code Online (Sandbox Code Playgroud)
克隆是数组的浅表副本.
此测试代码打印:
[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));
}
}
Run Code Online (Sandbox Code Playgroud)