共同点:用来复制
不同点:在有指针的情况下,浅拷贝只是增加了一个指针指向堆空间,而深拷贝则是申请一个新的堆空间并且增加一个指针,使这个增加的指针指向这个新的内存。采用深拷贝则释放内存时不会出现重复释放同一堆空间的情况。
深拷贝
浅拷贝
由于有用到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)随之改变,说明是浅拷贝。
如果有误欢迎后台勘正