关于System.arraycopy()是深拷贝还是浅拷贝的一些想法和验证

共同点:用来复制

不同点:在有指针的情况下,浅拷贝只是增加了一个指针指向堆空间,而深拷贝则是申请一个新的堆空间并且增加一个指针,使这个增加的指针指向这个新的内存。采用深拷贝则释放内存时不会出现重复释放同一堆空间的情况。

深拷贝

浅拷贝

由于有用到System.arraycopy做函数拷贝的需求,所以笔者就在思考这个函数对于数组引用是深拷贝还是浅拷贝,对数组元素是浅拷贝还是深拷贝?

直接说结论,使用System.arraycopy做数组拷贝时,对于数组引用来说是深拷贝,对于部分类型(基本数据类型,包装类,String)的数组元素是深拷贝,其他都是浅拷贝

接下来是验证

新建test和people类

说明 : p1 p2 p3为 people[] 类型的数组,大小10

class People {
    public int age = 10;
    public String name = "p1";
    public char c = '1';
}

浅拷贝

扫描二维码关注公众号,回复: 15548970 查看本文章
People[] p1 = new People[10];
        p1[0] = new People();
        People[] p2 = p1;
        System.out.println(p1);    //People;@7d4991ad
        System.out.println(p2);    //People;@7d4991ad
        System.out.println("******************************************");
        System.out.println(p1[0]);      //People@28d93b30
        System.out.println(p2[0]);      //People@28d93b30
        System.out.println("******************************************");

深/浅拷贝

        People[] p3 = new People[10];
        p3[0] = new People();
        System.arraycopy(p3,0,p1,0,p1.length);
        System.out.println(p1);        //People;@7d4991ad
        System.out.println(p3);        //People;@1b6d3586
        System.out.println("******************************************");
        System.out.println(p1[0]);        //People@4554617c
        System.out.println(p3[0]);        //People@4554617c
        System.out.println("******************************************");
        p3[0].age = 30;
        System.out.println(p1[0].age);        //30
        System.out.println(p3[0].age);        //30

p1 = p2是浅拷贝,显而易见这里不给解释。

P3经过arraycopy后地址值与P1不同,说明对于数组引用来说是深拷贝

P3和P1的元素为自定义People型,也就是说P3和P1是对象类型的数组的引用,P1 P3的元素(People类型的对象)地址相同,修改P3[0]的属性(age)时,P1[0]的属性(age)随之改变,说明是浅拷贝。

如果有误欢迎后台勘正

猜你喜欢

转载自blog.csdn.net/weixin_52502987/article/details/129394174
今日推荐