System.arraycopy() 浅拷贝 深拷贝
在分析ArrayList源码的时候,在clone()方法中对System.arraycopy()是如何拷贝数据的产生了疑问?网上的答案是浅拷贝,看不到代码的具体实现就做几个例子测试一下
答案 ,对System.arraycopy()确实是浅拷贝,不会进行递归拷贝,所以产生的结果是基本数据类型是值拷贝,对象只是引用拷贝
基本数据类型
public static void main(String[] args) {
ArrayList<String> listStr = new ArrayList<>();
for(int i = 0 ; i < 3 ;i++){
listStr.add(i+"");
}
//clone一次
ArrayList<String> listStrCopy = (ArrayList<String>) listStr.clone();
//修改clone后对象的值
listStrCopy.remove(2);
listStrCopy.add(100+"");
for (int i = 0; i < listStr.size(); i++) {
System.out.println(listStr.get(i).toString());
System.out.println(listStrCopy.get(i).toString());
}
}
实验结果 , 可以看出修改对原始数据没有改变,是复制了值
0
0
1
1
2
100
class对象
public class Copy {
public static void main(String[] args) {
ArrayList<Person> listStr = new ArrayList<>();
for (int i = 0; i < 3; i++) {
listStr.add(new Person(i));
}
ArrayList<Person> listStrCopy = (ArrayList<Person>) listStr.clone();
//修改clone产生的对象
listStrCopy.get(0).setAge(100);
for (int i = 0; i < listStr.size(); i++) {
System.out.println(listStr.get(i).toString());
System.out.println(listStrCopy.get(i).toString());
}
}
static class Person{
private int age;
public Person(int age) {
this.age = age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"age=" + age +
'}';
}
}
}
实验结果 ,修改clone产生对象直接对原list产生了影响,是浅拷贝
Person{age=100}
Person{age=100}
Person{age=1}
Person{age=1}
Person{age=2}
Person{age=2}