System.arraycopy() 浅拷贝 深拷贝

来源:互联网 发布:模拟位置软件 编辑:程序博客网 时间:2024/06/08 13:17

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());        }    }实验结果 , 可以看出修改对原始数据没有改变,是复制了值00112100

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}