关于深拷贝和浅拷贝的总结
关于什么是深拷贝和浅拷贝以及怎么实现我就不多说了网上有很多,我这里就是总结为深拷贝和浅拷贝有什么不同以及为什么浅拷贝的情况下为什么分为基本数据类型,引用数据类型,和String三种数据来看待。
深拷贝和浅拷贝的区别总结一句话就是:浅拷贝传递的只是栈中的内容,这个传递指的是实参向形参传递的内容。
我们知道基本数据类型在栈中存储的就是数值,引用数据类型在栈中存储的就是堆中对象的地址。
1:对于基本数据类型我们不用多说了,数据都是在栈中的,当向一个方法传递参数的时候栈帧中的变量就是一个新的变量了新栈帧中变量改变和上一个栈帧是没关系的。
2:对于引用数据类型,栈中存储的是对堆中对象地址的引用,所以当向一个方法中传递时,两个栈帧中的对象引用一块地址,所以在第二个栈帧中修改地址块中的数据,在第一个栈帧中能看到修改的结果。
3:那么对于String类型的数据有什么特殊呢?它的特殊点就在于,虽然它是引用数据类型,而且两个栈帧之间的String对象是应用同一块内存,但是如果要是在第二个栈帧中对String对象进行修改,不会对第一个栈帧中的String产生影响,
这个因为,String是单独存放在堆中的常量池中的,这是一块单独的内存,当在第二个栈帧中对String发生改变,就把第二个栈帧中String变量引用的地址指向新的字符串常量,所以两个栈帧中的String引用就会分开了,从而产生了和基本数据类型
一样的效果。
加深理解,参考下图: