同一个坑踩两次,特此记录防止三入大坑java深拷贝浅拷贝

什么是浅拷贝


浅拷贝


浅拷贝代码


浅拷贝运行结果

你会发现如果list1变了但是不对list2进行操作,但是打印的结果是list1和list2都发生了变化这就是浅拷贝。

众所周知,list本质上是数组,而数组的是以地址的形式进行存储。

如上图将list A浅拷贝给list B,由于进行的是浅拷贝,所以直接将A的内容复制给了B,java中相同内容的数组指向同一地址,即进行浅拷贝后A与B指向同一地址。

造成的后果就是,改变B的同时也会改变A,因为改变B就是改变B所指向地址的内容,由于A也指向同一地址,所以A与B一起改变。

什么是深拷贝


深拷贝示意图

深拷贝就是将A复制给B的同时,给B创建新的地址,再将地址A的内容传递到地址B。ListA与ListB内容一致,但是由于所指向的地址不同,所以改变相互不受影响。


深拷贝代码


运行结果

从代码到运行结果可以看出虽然oldlist发生了改变但是newlist没有改变。当然深拷贝还可以用序列化,clone等方法。

其实代码错在深拷贝和浅拷贝上是很低级的错我,希望看到这篇文章的童鞋们在list1 = list2 的时候一定要想list1被赋值是做什么的。在代码执行过程中有没有可能list2会发生变化。如果可能会发生变化那就要考虑对集合进行深拷贝了。

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

推荐阅读更多精彩内容