这确实进行了浅复制,下面是来自ArrayList源代码的clone方法的注释:
返回此ArrayList实例的浅表副本。(元素本身不会被复制。)
为了理解这一点,让我们看一下ArrayList中clone方法的片段。
v.elementData = Arrays.copyOf(elementData, size);
我们知道,当我们将一个对象分配给变量时,JAVA不会创建一个全新的该对象的副本。相反,这个变量成为另一个指向原始对象的引用。
因此,elementData实际上存储着放入这个ArrayList中的对象的引用。而克隆只是复制这些引用,没有创建任何对象的副本。
当然,您可以从克隆的ArrayList中删除或添加新的引用。
然而,在一个ArrayList中修改旧对象将影响到原始ArrayList。由于Integer是不可变的,很难通过您的示例进行说明。
为了看到副作用,您可以定义一个自定义的可变对象。
class Person {
private int a;
public void setA(int a) {
this.a = a;
}
public int getA() {
return a;
}
@Override
public String toString() {
return String.valueOf(a);
}
}
那么您可以使用以下代码来进行测试。
Person p1 = new Person();
Person p2 = new Person();
ArrayList<Person> tt = new ArrayList<Person>();
tt.add(p1);
tt.add(p2);
ArrayList<Person> yy = (ArrayList<Person>) tt.clone();
Person vv = yy.get(yy.indexOf(p2));
vv.setA(12);
yy.remove(p1);
System.out.println("tt: " + tt);
System.out.println("yy: " +yy);
输出结果应该是:
tt: [0, 12]
yy: [12]
看到副作用了吗?我们只改变了yy中的元素,但它也反映在tt中。