初探深/浅拷贝

  • 前言

        尽管现在学习中并没有过多的涉及过多的深浅拷贝的内容,但区分深拷贝和浅拷贝会可以对java内存结构和运行方式有更深的了解。在初次尝试了使用深浅拷贝后,发现了clone()方法的水并不浅。再阅读了深度解析clone()实现深浅拷贝的博文后也发现了若要真正掌握深浅拷贝,并不是在于简简单单的识别 还是 。而是要掌握其背后值传递和引用传递的原理。它们有时候还会共存。
        so,本次内容只记录到简单的深浅拷贝原理。等到鄙人水平有所提高时,再往下记录。
        ps:以下提到的引用,若觉得生涩,都可以换成地址来理解整句话。java万物皆对象,但其实对象也就是一个地址值,说到底,java就只有值传递hahah

首先这是一个定义好的对象

  • 什么是浅拷贝?

        如果这个时候,要求将Soldier对象进行拷贝,也就是将Soldier整个复制一遍,不仅是自己,还将包含的成员复制一份,你将如何实现?这个时候我们不自觉地从拷贝联想到复制。并编写了如下代码.

        进行一系列输出测试

        得到的结果

        我们确实实现了对p1(Soldier)的复制,与其说是复制,更不如说是我们把p1所有存储的地址值都赋给p2,p1 p2除了本身的地址值不同,两个对象几乎拥有一模一样的地址指向。just like that~


        不仅是基本数据类型,就连引用数据类型,我们一并实现了值的传递和引用的传递。恭喜你,你实现了一个拷贝类型中的浅拷贝!! 让我们来看一下浅拷贝的概念。

对基本数据类型进行值传递,对引用数据类型进行引用传递般的拷贝,此为浅拷贝。

  • 什么是深拷贝?

        你可能会产生疑惑,如果上述的拷贝浅拷贝,那什么又叫深拷贝呢,难道还有另一种复制方式吗?答案是确实有,它的结构长这样。完全镜像却又毫无关联。

        让我们看一下深拷贝的概念。

对基本数据类型进行值传递,对引用数据类型,创建一个新的对象,并复制其内容,此为深拷贝。

        我们再次编写代码。

        进行一系列输出测试

        可以看到除了基本数据类型的age(返回为true),其他的引用数据类型均创建了新的对象(返回为false)。

完全镜像却又毫无关联。

  • 深浅拷贝的优缺点?

    浅拷贝:相较于深拷贝效率高,且节省空间。但浅拷贝的结构会导致牵一发而动全身。只要任意一个拷贝对象(或原有对象)中的引用发生改变,所有对象均会受到影响。

    深拷贝:修改任意一个对象,不会对其他对象产生影响,但它效率低且浪费空间(相较于浅拷贝)。

下一次,让我们进军clone()方法!!!