zoukankan      html  css  js  c++  java
  • 浅拷贝与深拷贝的理解

    浅拷贝与深拷贝

    首先我们要知道什么是浅拷贝和深拷贝

    浅拷贝:拷贝的值改变时原来的值跟着一起改变。

    深拷贝:拷贝的值可以无限层拷贝,拷贝值与原始值不发生任何影响


    我们先来看一个浅拷贝

    可以看到,我们拷贝的值发生改变时,原始值也在发生改变。

    那么什么是深拷贝呢
    这里我们利用json的属性即可完成深拷贝。
    注意:json只能拷贝object和array,不能拷贝function。

    拷贝值与原始值不发生任何影响

    到这里你可能会想,浅拷贝改变值相互影响,深拷贝不相互影响,很简单嘛。

    我们再来看一个例子

    你不是说浅拷贝是互相影响的嘛?为什么这里a.c和b.c不相同呢? `这里要注意,当object只有一层时是深拷贝`

    有人可能会想,浅拷贝中既然互相影响,那么他们指向的应该是同一个值吧。
    这里只说对了一半,我们都知道object是引用类型,引用类型存放在堆内存中,原始类型存放在栈内存中,这里很明显是引用类型。
    在堆内存中(引用类型),拷贝的值储存的是引用地址,而不是值。所以当引用地址的内容发生改变时,所有指向内存地址的变量都发生改变。

    这里我们进行打印一下,如果引用地址相同两个变量应相等。

    正好验证了,当object只有一层时是深拷贝,两个值不相等。 其他层拷贝则都是浅拷贝。

    所以,我们判断两个值是否是浅拷贝时,还可以通过两个变量是否相等来判断。

    总结

    1. 浅拷贝:拷贝的值改变时原来的值跟着一起改变,注意当object只有一层时是深拷贝。
    2. 深拷贝:拷贝的值可以无限层拷贝,拷贝值与原始值不发生任何影响。
    3. 使用JSON深拷贝时,只能进行拷贝对象或数组,不能拷贝函数,如果拷贝函数要使用递归的方式。
    4. 如果两个变量的指针相等,则是浅拷贝。
  • 相关阅读:
    大数据量业务订制和解决方案思考
    gc内存回收机制
    HashMap的扩容机制, ConcurrentHashMap和Hashtable主要区别
    开源工作流引擎内核主要关心的是什么?
    mysql查询计划
    mysql 存储引擎MYSIAM和INNODB特性比较
    任意输入字符,对字符匹配进行判断
    java 对list中对象按属性排序
    mysql 写数据操作几次硬盘?
    win7_64位+U盘制作centos6.3+安装centos
  • 原文地址:https://www.cnblogs.com/lovecode3000/p/12500911.html
Copyright © 2011-2022 走看看