Java中的深拷贝与浅拷贝
Java中的浅拷贝和深拷贝
在定义immutable类型的类时,为了防止将属性的引用暴露出去,经常需要返回一个copy。
同时在开发的过程中,会遇到把现有的一个对象的所有属性拷贝给另一个对象的需求
Java中的数据类型分为基本数据类型和引用数据类型。对于这两种数据类型,在进行参数传递时会有值传递和引用传递的差别
浅拷贝
对于基本数据类型的成员对象,数据类型按值传递,这种copy方式直接将属性的值赋给新对象,因为是按值传递,此时修改其中一个对象的值,不会影响到另一个。
对于引用类型的成员对象,引用类型是引用传递,copy是把对象的地址赋值给新对象,此时两个引用指向同一内存空间,改变其中一个,对另外一个也产生影响
假设有对象obj1,它包含两个子对象containedObj1和containedObj2
浅拷贝就是创建一个新对象,在内存开辟新地址空间生成obj2,但obj2的子对象没有没有生成新的地址空间,只是拷贝了obj1子对象的引用
深拷贝
对于基本数据类型的成员对象,数据类型按值传递,这种copy方式直接将属性的值赋给新对象,因为是按值传递,此时修改其中一个对象的值,不会影响到另一个。
对于引用类型,深拷贝会新创建一个对象空间,然后拷贝内容,两个引用指向不同的内存空间,此时改变其中一个不会对另一个产生影响
深拷贝相比于浅拷贝速度慢花销大
上述例子中浅拷贝无法拷贝子对象,此时就要用深拷贝,深拷贝拷贝obj1和obj1的所有子对象