我们通常在对数据进行拷贝的时候会踩到数据拷贝的坑中,主要是对数据和指针的引用区别,这篇文章就主要分析深、浅拷贝的区别和方式
堆&栈
如下图所示,两者都是存放临时数据的地方。
栈是先进后出的,就像一个桶,后进去的先出来,它下面本来有的东西要等其他出来之后才能出来。
堆是在程序运行时,而不是在程序编译时,申请某个大小的内存空间。即动态分配内存,对其访问和对一般内存的访问没有区别。对于堆,我们可以随心所欲的进行增加变量和删除变量,不用遵循次序。
数据类型分为基础类型和引用类型,在我们声明数据的时候,基础类型时存放到栈里面,引用类型时存放到堆里面,在拷贝的时候是直接从栈这边去取,获取基本类型时直接获取值本身,而引用类型只是在栈这边存的是一个指向堆相应地址的指针。
赋值、深浅拷贝的区别:
赋值:当我们把一个对象赋值给一个新的变量时,赋的其实是该对象的在栈中的地址,而不是堆中的数据。也就是两个对象指向的是同一个存储空间,无论哪个对象发生改变,其实都是改变的存储空间的内容,因此,两个对象是联动的。
浅拷贝:浅拷贝是创建一个新对象,这个对象有着原始对象属性值的一份精确拷贝。如果属性是基本类型,拷贝的就是基本类型的值,如果属性是引用类型,拷贝的就是指向堆的地址 ,所以如果一个拷贝对象改变了其中的一个地址,则另一个拷贝对象的该地址也会发生改变。
深拷贝: 深拷贝是将一个对象从内存中完整的拷贝一份出来,从堆内存中开辟一个新的区域存放新对象,且修该拷贝后的对象不会影响到原有的对象;
赋值:
浅拷贝:
深拷贝:
网友评论