Java 浅拷贝

2025年5月12日 | 阅读 3 分钟

Java 中,创建对象的克隆或副本是最重要的任务。在本节中,我们将讨论Java 中浅拷贝是什么以及如何创建 Java 对象的浅拷贝。在进行浅拷贝之前,我们将首先理解Java 中什么是拷贝以及引用拷贝对象拷贝之间的区别。

顾名思义,引用拷贝会创建一个指向对象的引用变量的副本。例如,如果我们有一个 Byke 对象,myByke 变量指向它,并且我们进行引用拷贝,那么我们现在将有两个 myByke 变量,但仍然只有一个对象。

对象拷贝会创建对象本身的副本。因此,如果我们再次复制我们的 byke 对象,我们将创建对象本身的副本,以及一个引用该复制对象的第二个引用变量。

浅拷贝

对象的浅拷贝是一个新对象,其实例变量与旧对象相同。例如,集合的浅拷贝具有与旧集合相同的成员,并通过指针与旧集合共享对象。浅拷贝有时被称为使用引用语义。

Shallow Copy Java

换句话说,我们可以说在浅拷贝中只复制引用。因此,原始对象和拷贝对象都指向同一个引用。创建一个指向同一内存位置的新引用。请注意,当我们尝试修改拷贝对象中的数据时,更改也会反映在原始对象中。

Shallow Copy Java

当我们使用浅拷贝机制创建对象副本时,会复制原始对象的所有字段。另一方面,如果它包含对象作为字段,则只复制对这些对象的引用,而不是完整的对象。需要记住的一点是,只有原始数据类型会被复制,而对象引用不会被复制。

Shallow Copy Java

注意:Object 类的 clone() 方法默认创建浅拷贝。

考虑以下代码片段。

Java 浅拷贝程序

ShallowCopyExample.java

输出

Original (orginal values): Person-A - Civic
Clone (before change): Person-A - Civic
Clone (after change): Person-B - Accord
Original (after clone is modified): Person-A - Accord

浅拷贝与深拷贝

浅拷贝深拷贝
克隆对象和原始对象不完全分离。克隆对象和原始对象完全分离。
对克隆对象的修改也会在原始对象中模仿,反之亦然。对克隆对象的修改也会在原始对象中模仿,反之亦然。
clone() 方法的默认版本创建对象的浅拷贝。要创建对象的深拷贝,我们必须覆盖 clone() 方法。
如果对象只有原始字段,则首选浅拷贝。如果对象具有对其他对象的引用作为字段,则首选深拷贝。
它速度快且成本较低。它速度慢且成本很高。
内存得到有效利用。内存未得到有效利用。
它不太容易出错。它很容易出错。