Java 中浅拷贝和深拷贝的区别10 Sept 2024 | 5 分钟阅读 克隆是 Java 中一个基本概念,它允许开发人员创建对象的副本。此过程对于各种场景至关重要,例如保存对象的状态、创建备份或实现某些设计模式。然而,Java 提供了两种不同的克隆机制:浅拷贝和深拷贝。理解这两种方法之间的区别对于有效的对象复制和避免代码中意外行为至关重要。 浅克隆浅拷贝创建一个新对象,但不会复制原始对象引用的对象。相反,它会复制对这些对象的引用。因此,原始对象和克隆对象都共享对同一对象的引用。浅拷贝是一个快速有效的过程,但它有一些限制,尤其是在处理复杂对象结构时。 让我们看一个例子 在此示例中,如果我们对 Person 对象执行浅拷贝,name 属性将被复制,但原始 Person 对象和克隆的 Person 对象都将引用同一个 Address 对象。通过一个实例对 Address 对象所做的更改将在另一个实例中反映出来。 深克隆另一方面,深拷贝会创建一个原始对象的完全独立的副本,以及其引用的所有对象的副本。这确保对克隆对象或其嵌套对象所做的更改不会影响原始对象,反之亦然。然而,深拷贝可能更耗费资源,并且可能涉及复杂的对象遍历。 为了实现深拷贝,一种常用的方法是序列化和反序列化对象,从而有效地创建一个没有任何共享引用的新副本。以下是使用 ObjectOutputStream 和 ObjectInputStream 类的示例: 需要注意的是,要使对象能够进行深拷贝,其所有嵌套对象也必须支持克隆或序列化。 选择浅拷贝还是深拷贝选择浅拷贝还是深拷贝取决于我们应用程序的具体要求。浅拷贝速度更快、更简单,适用于共享引用可接受的情况。但是,如果您需要对象的嵌套对象的真正独立副本,深拷贝是更安全的选择,尽管性能成本可能更高。 文件名: CloningExample.java 输出 Original Person: Person{name='UpdatedJohn', address=Address{city='UpdatedCityA', country='CountryA'}} Shallow Cloned Person: Person{name='John', address=Address{city='UpdatedCityA', country='CountryA'}} Deep Cloned Person: Person{name='John', address=Address{city='CityA', country='CountryA'}} 注意:输出可能会根据您使用的 Java 版本而有所不同。关键点是要观察原始对象的变化如何影响克隆对象。解释在此示例中,我们有一个包含 name 和 Address 对象的 Person 类。Address 类已实现可序列化以进行深拷贝。CloningExample 类演示了原始 Person 对象的创建以及浅拷贝和深拷贝的生成。输出将展示浅拷贝和深拷贝之间的差异。 原始 Person 原始 Person 对象已更新为新的姓名(“UpdatedJohn”)和 Address 对象中的更新城市(“UpdatedCityA”)。 浅拷贝的 Person 浅拷贝(shallowClonePerson)反映了对原始 Person 对象所做的更改。原始对象和浅拷贝都共享对同一 Address 对象的引用,因此对 Address 对象的更改在这两者中可见。 深拷贝的 Person 深拷贝(deepClonePerson)不受对原始 Person 对象所做的更改的影响。它拥有通过深拷贝过程创建的 Address 对象的自己的副本。因此,对原始对象或浅拷贝的更改不会影响深拷贝。 此输出突显了浅拷贝和深拷贝之间的差异,说明了在这两种情况下嵌套对象的更改是如何管理的。 Java 中的浅拷贝与深拷贝
该表总结了浅拷贝和深拷贝之间的主要区别,为理解它们在 Java 中的特性和用例提供了快速参考。 总之,理解 Java 中浅拷贝和深拷贝的区别对于编写健壮且可维护的代码至关重要。我们选择浅拷贝的效率还是深拷贝的隔离性,取决于我们应用程序的具体需求以及我们正在处理的对象本身的性质。 |
在不断发展的技术格局中,自然语言处理 (NLP) 在弥合人类交流与计算机理解之间的差距方面发挥着至关重要的作用。Java 是一种通用且广泛使用的编程语言,它使开发人员能够通过各种库和框架来利用 NLP 的潜力……
阅读 3 分钟
在 Java 中,包在消除命名冲突、控制访问以及使类、枚举、接口和注释的搜索和使用更容易方面发挥着重要作用。为了将相关的类、接口和子包分组,我们使用包。通过使用包:非常...
阅读 3 分钟
在 Jackson 中,Tree Model Node 是我们将在此部分讨论的最重要概念之一。我们将使用 Tree Model Node 进行各种转换以及添加、修改和删除节点。让我们了解如何创建节点、转换...
阅读 32 分钟
行为驱动开发 (BDD) 是一种软件开发方法论,作为测试驱动开发 (TDD) 的演变而出现。BDD 通过使用通用语言来描述系统的预期行为,强调开发人员、测试人员和业务利益相关者之间的协作。在 Java 生态系统中,BDD 被广泛...
阅读 3 分钟
Java 提供了许多方法调用来检查和更改文件的权限,例如将只读文件更改为具有写入权限。当用户想要限制或修改允许的操作时,需要更改文件权限...
5 分钟阅读
Java 中的最小回文问题,给定一个表示整数的字符串 n,我们的任务是找到回文数并返回最接近的整数(不包括它本身)。如果存在平局,则返回较小的那个。绝对差值...
阅读9分钟
java.nio.DoubleBuffer 有 order() 函数。可以使用 DoubleBuffer 类获取此 DoubleBuffer 实例的 ByteOrder。语法:public abstract ByteOrder order()返回值:此函数返回此缓冲区的字节顺序。示例 1:代码展示了如何管理和检查内容……
阅读 2 分钟
在本节中,我们将学习什么是九边形数,并创建 Java 程序来检查给定的数字是否为九边形数。九边形数程序经常在 Java 编码面试和学术界中被问到。九边形数九边形数是图形...
5 分钟阅读
java.nio.DoubleBuffer 有一个 allocate() 函数。使用 DoubleBuffer 类在当前缓冲区旁边分配一个新的双缓冲区。新缓冲区的起始位置将为零。它的容量将是它的限制。它将有一个不明确的标记。它的所有元素都将...
阅读 2 分钟
在本教程中,我们将详细讨论 Amazon Polly。什么是 Amazon Polly?Amazon Polly 是 Amazon Web Services (AWS) 的一项云服务,AWS 是 Amazon.com 的子公司,它将文本转换为逼真的语音。它允许创建会说话的应用程序,并建立全新的类别……
阅读 6 分钟
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India