这确实做了一个浅拷贝,这里是对克隆的注释,来自 ArrayList 源代码
返回此 ArrayList 实例的浅表副本。 (元素本身不会被复制。)
为了理解这一点,让我们看一下 ArrayList 中的一个 sn-p in clone 方法
v.elementData = Arrays.copyOf(elementData, size);
正如我们所知,当我们将一个 Object 赋值给一个变量时,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]
年:[12]
看到副作用 :) ?我们只改变了yy中的元素,但也体现在了tt中。