Java中浅拷贝与深拷贝的区别
今天在在学习java中,看到了clone()方法,查看一些资料,以及自己探索了一些关于浅克隆(shadow)与深克隆(deep clone)之间的关系,就此来发表一些我自己的看法。
浅拷贝: 首先,浅拷贝实际上就是在拷贝成员变量的时候,只拷贝了基本数据类型和String数据类型。因为String数据类型是一种特殊的引用类型,JDK的设计者将String类型设计成了“不可变”(相对于StringBuffer和StringBuilder来说)的字符串,所以在这里可以把String类型的变量当成一个常量。
但是,对于普通的引用数据类型,浅拷贝只是把这个数据类型的地址拷贝了一份,地址所指向的数据内容,并没有拷贝,所以可以看做是两个地址指向了同一个内容。因此,当要改变一个对象的引用类型的成员变量时,那么,就要改变引用数据的内容。但是这样一来,内容发生改变,那么拷贝的对象所指向这个内容的地址可能没变,但是内容也已经发生了变化。
我们可以把这个引用数据的内容看做是一个人,而两个指向内容的地址,就像是一个人的两个名字一样。
所以,浅拷贝:当一个对象的引用数据内容发生变化,那么另一个对象的引用数据内容就也会发生变化。
深拷贝:深拷贝中所拷贝出来的对象和原本对象之间没有存在关系,他们是两个相互独立存在的对象,即一个对象发生改变,另一个对象并不会发生改变。