Java 中的浅拷贝与深拷贝2025年9月4日 | 阅读7分钟 在本节中,我们将讨论 Java 中浅拷贝和深拷贝之间的主要区别。让我们来理解浅拷贝和深拷贝。 浅拷贝当我们复制某个实体以创建两个或两个以上的实体,并且在一个实体中的更改会反映在其他实体中时,我们可以说我们已经进行了浅拷贝。在浅拷贝中,不会为其他实体进行新的内存分配,只会将引用复制到其他实体。以下示例演示了这一点。 文件名: ShallowCopyExample.java 输出 The value of x is: 6 说明: 在上面的示例中,我们使用引用变量 obj2 更新 x 的值,并使用引用变量 obj1 显示 x 的值。在输出中,我们看到更新后的值 6,而不是原始值 30。这是因为 obj1 和 obj2 指向相同的内存位置。因此,无论我们使用引用变量 obj2 进行什么更新,使用引用变量 obj1 都会反映相同的更改。 深拷贝当我们复制某个实体以创建两个或两个以上的实体,并且在一个实体中的更改不会反映在其他实体中时,我们可以说我们已经进行了深拷贝。在深拷贝中,会为其他实体进行新的内存分配,并且不会将引用复制到其他实体。每个实体都有自己的独立引用。以下示例演示了这一点。 文件名: DeepCopyExample.java 输出 The value of x is: 30 说明: 在上面的示例中,我们使用引用变量 obj2 更新 x 的值,并使用引用变量 obj1 显示 x 的值。在输出中,我们看到原始值 30,而不是更新后的值 6。这是因为 obj1 和 obj2 指向不同的内存位置。因此,无论我们使用引用变量 obj2 进行什么更新,使用引用变量 obj1 都不会反映相同的更改。 浅拷贝与深拷贝的区别在学习了浅拷贝和深拷贝之后,让我们看看它们之间的区别。
深拷贝和浅拷贝相似的场景尽管深拷贝和浅拷贝之间存在差异,但在某些情况下,考虑拷贝是深拷贝还是浅拷贝没有意义。 在 String 中让我们了解一下复制字符串时会发生什么。我们都知道字符串被认为是 java.lang 包中 String 类的对象。因此,与其他对象类似,当我们进行复制时,会复制引用。 文件名: StringCopyExample.java 输出 The hash code is: -2026030341 The hash code is: -2026030341 说明: 程序输出显示引用变量 obj1 和 obj2 显示的哈希码相同。这意味着引用变量 obj1 和 obj2 指向相同的内存位置。但是问题是,我们可以说我们上面的程序进行了浅拷贝吗?因为引用是相同的?答案是否定的。以下示例为我们提供了足够的证据来验证给出的答案。 文件名: StringCopyExample1.java 输出 The hash code is: -2026030341 The string is: JavaTpoint is a very good site. The hash code is: 1724527163 The string is: JavaTpoint is very good. 说明: 程序输出告诉我们,引用变量 obj1 显示的哈希码不等于引用变量 obj2 显示的哈希码。此外,使用引用变量 obj2 所做的更改不会由引用变量 obj1 显示。这是因为Java 中的字符串始终是不可变的。因此,当 obj2 更改 obj1 的内容时,它最终会创建一个全新的字符串。因此,之前的字符串保持不变,引用变量 obj2 指向存储新字符串对象的新内存位置。 我们已经看到,字符串中的更改会导致隐式创建新的字符串对象。因此,复制字符串既不能称为深拷贝也不能称为浅拷贝。事实上,当我们处理 Java 中的字符串时,深拷贝和浅拷贝之间没有区别。 在原始数据类型中让我们了解一下复制原始数据类型时会发生什么。与字符串不同,原始数据类型不是对象。但是,与字符串类似,在原始数据类型中也没有深拷贝或浅拷贝的概念。观察以下示例。 文件名: DataTypeCopyExample.java 输出 The value of x & y are: 9, 9 The value of x & y are: 9, 10 The value of b1 & b2 are: false, false The value of b1 & b2 are: false, true 说明: 当 y 的值更新时,它不会影响 x 的值。这是因为 y 已经有了自己的内存分配。它并不指向 x 的内存位置。因此,语句 y = x; 仅将 x 的值复制到 y 中。因此,y 的任何更新都不会影响 x。类似的原理也适用于其他原始数据类型。在这里,y 和 b2 的内存分配是隐式发生的。 在 Java 中,没有规定何时使用浅拷贝和何时使用深拷贝。由程序员或开发人员决定他们想要使用什么。因此,建议了解需求,然后明智地在深拷贝和浅拷贝之间做出选择。 除了深拷贝和浅拷贝之外,还有一个术语叫做延迟拷贝。延迟拷贝实际上是深拷贝和浅拷贝的混合。在延迟拷贝中,在初始阶段使用浅拷贝。当修改原始内容时,程序通过计数器检查内容是否在其他对象之间共享。如果内容被共享,则应用深拷贝机制。 |
什么是 .NET?Microsoft 的 .NET 框架是一个开源框架,面向 Microsoft 产品用户。该框架最初于 2002 年发布时是专为 Microsoft 设计的。这意味着您无法在 Linux、Android 或 iOS 上编写代码或执行生成的应用程序。它曾经是...
阅读 3 分钟
? Java 是一种面向对象的编程语言,允许使用引用变量来处理对象及其数据。在 Java 中,对象在堆内存中动态创建,并使用引用变量来保存这些对象的内存地址。这种引用概念...
阅读 3 分钟
Java 长期以来一直是企业软件开发的核心,以其平台独立性、强大的生态系统和强大的社区支持而闻名。随着我们进入微服务和云计算时代,Java 仍在不断调整和变化,尤其是在引入容器化技术之后...
阅读 8 分钟
这是 Google、Amazon、TCS、Accenture 等顶尖 IT 公司面试中经常遇到的问题。 为了解决这个问题,需要检查应聘者的逻辑能力、批判性思维和解决问题的能力。 因此,在本节中,我们将解决...
5 分钟阅读
在 Java 中,java.lang.NoClassDefFoundError 是一个类错误,当 Java 虚拟机 (JVM) 无法正确加载和初始化类时发生。此错误是运行时错误,这意味着它发生在程序运行时,而不是在编译时。此问题通常...
阅读 4 分钟
在 Java 中将 Long 转换为 Date 在本文中,我们将学习 Java 中的 Long 和 Date 是什么,以及它们在 Java 编程语言中的实现。我们还将深入讨论如何将 Long 值转换为 Date 值...
阅读 8 分钟
在本节中,我们将了解矩阵中的鞍点是什么,以及如何通过 Java 程序找到矩阵的鞍点。矩阵中的鞍点是什么?在矩阵中,一个元素被称为鞍点,它是...
阅读 3 分钟
Java 中的构造函数是一段类似于方法的代码。它在创建类实例时被调用。调用构造函数时,会为对象分配内存。它是一种特殊的类型的方法,用于初始化...
阅读 6 分钟
ASCII 代表美国信息交换标准代码。ASCII 是一种标准数据传输代码,计算机用于表示文本数据和控制字符。ASCII 是一种 7 位字符集,包含 128 个字符,即从 0 到 127。ASCII 表示...
阅读 12 分钟
要在 Java 中将文件转换为十六进制,可以使用 Integer 类的 toHexString 方法。此方法接受一个整数作为输入,并返回其十六进制值的字符串表示。以下是如何使用此方法的示例...
阅读 12 分钟
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India