2019-07-30 深拷贝和浅拷贝

一、浅拷贝

数据类型如果是基本类型,会按照值传递,进行赋值操作,将属性值复制一份给新的对象;

如果是引用类型的数据变量,将内存的引用地址复制一份给新的变量,实际上是两个对象的成员变量都指向一个实例;

这种情况下对一个成员变量的修改会影响到另一个成员变量。

二、深拷贝

不止要复制对象的 所有基本属性和成员对象的值,还要为所有对象申请内存空间,并且复制每个引用类型的成员变量,换而言之就是对整个对象图进行拷贝。

浅拷贝与深拷贝的区别

浅拷贝只是复制并传递地址引用,让多个对象指向相同的地址;而深拷贝直接连地址空间都全部复制过来。


深拷贝原理图


浅拷贝原理图

示例程序的运行结果:


程序段1

该段程序的运行结果为p1、p2的名字互不相同,而年龄相同,这是因为p1将引用指向了新的一个字符串,没有在原来的基础上做修改

只是将原来指向摇头耶稣的指针修改为了指向“小傻瓜”的指针,因此p2的值不受影响;然而int类型是基本类型,需要值传递,所以修改年龄为99会导致统一修改的结果。

三、浅拷贝的两种实现方法

通过拷贝构造方法实现浅拷贝

通过重写clone()方法进行浅拷贝(如图所示)


四、深拷贝的两种实现方法

通过clone方法实现

通过序列化实现

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,160评论 1 32
  • 这是16年5月份编辑的一份比较杂乱适合自己观看的学习记录文档,今天18年5月份再次想写文章,发现简书还为我保存起的...
    Jenaral阅读 2,891评论 2 9
  • 307、setValue:forKey和setObject:forKey的区别是什么? 答:1, setObjec...
    AlanGe阅读 1,604评论 0 1
  • 写在前面 各类技术论坛关于深拷贝的博客有很多,有些写的也比我好,那为什么我还要坚持写这篇博客呢,之前看到的一篇博客...
    心_c2a2阅读 21,245评论 3 18
  • 一 又轮到我发传单了。 实际上刚开始来这里上班的时候,我是很不乐意发传单的,因为我觉得这有损我的自尊。 我的自尊来...
    五斗解酲阅读 547评论 0 1