- 前言
尽管现在学习中并没有过多的涉及过多的深浅拷贝的内容,但区分深拷贝和浅拷贝会可以对java内存结构和运行方式有更深的了解。在初次尝试了使用深浅拷贝后,发现了clone()方法的水并不浅。再阅读了深度解析clone()实现深浅拷贝的博文后也发现了若要真正掌握深浅拷贝,并不是在于简简单单的识别深 还是 浅。而是要掌握其背后值传递和引用传递
的原理。它们有时候还会共存。
so,本次内容只记录到简单的深浅拷贝原理。等到鄙人水平有所提高时,再往下记录。
ps:以下提到的引用
,若觉得生涩,都可以换成地址
来理解整句话。java万物皆对象,但其实对象也就是一个地址值,说到底,java就只有值传递
hahah
首先这是一个定义好的对象
- 什么是浅拷贝?
如果这个时候,要求将Soldier
对象进行拷贝,也就是将Soldier
整个复制一遍,不仅是自己,还将包含的成员复制一份,你将如何实现?这个时候我们不自觉地从拷贝
联想到复制
。并编写了如下代码.
进行一系列输出测试
得到的结果
我们确实实现了对p1(Soldier)的复制
,与其说是复制
,更不如说是我们把p1所有存储的地址值都赋给p2,p1 p2除了本身的地址值不同,两个对象几乎拥有一模一样的地址指向。just like that~
不仅是基本数据类型,就连引用数据类型,我们一并实现了值的传递和引用的传递。恭喜你,你实现了一个拷贝类型中的浅拷贝!! 让我们来看一下浅拷贝的概念。
对基本数据类型进行值传递,对引用数据类型进行引用传递般的拷贝,此为浅拷贝。
- 什么是深拷贝?
你可能会产生疑惑,如果上述的拷贝
为浅拷贝
,那什么又叫深拷贝
呢,难道还有另一种复制
方式吗?答案是确实有,它的结构长这样。完全镜像却又毫无关联。
让我们看一下深拷贝
的概念。
对基本数据类型进行值传递,对引用数据类型,创建一个新的对象,并复制其内容,此为深拷贝。
我们再次编写代码。
进行一系列输出测试
可以看到除了基本数据类型的age
(返回为true),其他的引用数据类型均创建了新的对象(返回为false)。
完全镜像却又毫无关联。
深浅拷贝的优缺点?
浅拷贝:相较于深拷贝效率高,且节省空间。但浅拷贝的结构会导致牵一发而动全身。只要任意一个拷贝对象(或原有对象)中的引用发生改变,所有对象均会受到影响。
深拷贝:修改任意一个对象,不会对其他对象产生影响,但它效率低且浪费空间(相较于浅拷贝)。