深度复制和浅复制的区别是什么?


当前回答

简单来说,浅拷贝类似于按引用调用,深拷贝类似于按值调用

在引用调用中,函数的形式参数和实际参数都指向相同的内存位置和值。

在按值调用中,函数的形式形参和实际形参都是指不同的内存位置,但具有相同的值。

其他回答

char * Source = "Hello, world.";

char * ShallowCopy = Source;    

char * DeepCopy = new char(strlen(Source)+1);
strcpy(DeepCopy,Source);        

“ShallowCopy”指向与“Source”相同的内存位置。 “DeepCopy”指向内存中的不同位置,但内容是相同的。

浅复制是创建一个新对象,然后将当前对象的非静态字段复制到新对象。如果字段是值类型——>,则执行字段的逐位复制;对于引用类型——>,引用被复制,但被引用的对象没有;因此,原始对象及其克隆对象引用同一个对象。

深度复制是创建一个新对象,然后将当前对象的非静态字段复制到新对象。如果字段是值类型——>,则执行字段的逐位复制。如果字段是引用类型——>,则执行引用对象的新副本。要克隆的类必须标记为[Serializable]。

为了补充其他答案,

对象的浅拷贝对值类型执行逐值复制 基于属性,并通过引用复制基于引用类型的属性。 对象的深度复制对基于值类型的对象执行逐值复制 属性,以及基于引用类型的按值复制 层次结构深处的属性(引用类型)

假设有两个数组arr1和arr2。

arr1 = arr2;   //shallow copy
arr1 = arr2.clone(); //deep copy

试着考虑下面的图像

例如Object。memberwisclone创建一个浅复制链接

并使用ICloneable接口,你可以得到深度拷贝,如这里所述