深拷贝和浅拷贝、及实现方式
- 直接赋值复制:
理解:两个相同的类对象赋值的话,复制的是引用,如将a2赋值给a1(A a1 = a2),则两个变量指向同一个对象,所以当a1变化时,a2也会变化;反之当a2变化时,a1也会变化。
- 浅拷贝:
理解: 创建一个新对象,将当前对象的非静态字段复制到该新对象,如果是基本数据类型,复制值;如果是引用数据类型, 复制引用但不复制引用的对象 即 两个对象的地址 指向 的是同一个 地址 。
- 深拷贝:
理解:深拷贝复制的不只是对象本身,还有对象包含的引用指向的所有对象, 即创建一个相同的对象,但 两个对象是单独分开的 ,各自指向各自的地址 。
- 内存四大组成部分:栈区、堆区、全局/静态区、只读区
- 栈区:
存放数据:局部参数、形参
- 堆区:
存放数据:new出来的数据
- 全局/静态区:
存放数据:全局变量和静态变量
- 只读区:
存放数据:常量
总结:
浅拷贝:复制引用但不复制引用的对象 ( 也就是简单的把栈中的引用地址拷贝了一份,当修改新拷贝的值的时候,被拷贝的对象也会被修改 )
实现: 正常的赋值就是浅拷贝。
深拷贝:复制引用并且复制引用的对象( 深拷贝的话会在堆内存中为新对象建立空间,也就是两个对象拥有各自的地址。 )
实现:最常用的是使用递归的方式实现, 也可以使用JSON、Object.assgin、MessageChannel实现
深拷贝的实现方式(超全) - 掘金 (juejin.cn)
还没有评论,来说两句吧...