Java深拷贝与浅拷贝技术解析及实例演示

摘要:本文将详细介绍Java中的深拷贝和浅拷贝概念,通过分析源码和举例说明,帮助读者更好地理解这两种拷贝方式的区别及应用场景。
一、深拷贝与浅拷贝的概念
深拷贝:复制一个对象后,无论是基本数据类型还是引用类型,都是重新创建的。简单来说,深拷贝就是进行了完全彻底的复制。
浅拷贝:对基本数据类型进行拷贝时,是值传递;对引用数据类型进行拷贝时,只是进行了引用传递,没有真实创建新的对象。
二、深拷贝与浅拷贝的实现

  1. 深拷贝
    Java中,所有的对象都继承自Object类,Object类中提供了一个方法供我们对Java对象进行拷贝:clone()。要想成功调用这个方法,首先该类要实现Cloneable接口,并覆盖clone()方法。
    深拷贝的实现过程如下:
    (1)实现Cloneable接口。
    (2)覆盖Object类的clone()方法。
    (3)在clone()方法中,对基本类型数据进行值传递,对引用类型数据创建一个新的对象,并复制其内容。
  2. 浅拷贝
    Java中的浅拷贝则是仅对基本数据类型进行值传递,对引用数据类型进行引用传递。当引用类型数据发生变化时,浅拷贝的对象也会受到影响。
    三、实例演示
    下面通过一个具体的例子来演示深拷贝和浅拷贝的区别。
    假设有一个Person类,其中包含两个属性:一个整数类型的基本数据类型变量a,和一个String类型的引用数据类型变量b。
public class Person implements Cloneable {private int a;private String b;public Person(int a, String b) {this.a = a;this.b = b;}@Overrideprotected Object clone() throws CloneNotSupportedException {Person clonedPerson = (Person) super.clone();clonedPerson.a = a; // 基本数据类型值传递clonedPerson.b = (String) b.clone(); // 引用数据类型值传递return clonedPerson;}
}

现在创建两个Person对象,分别进行深拷贝和浅拷贝。

public class Main {public static void main(String[] args) throws CloneNotSupportedException {Person person1 = new Person(1, "Hello");Person person2 = person1.clone();System.out.println("person1.a: " + person1.a);System.out.println("person2.a: " + person2.a);person1.b = "World";System.out.println("person1.b: " + person1.b);System.out.println("person2.b: " + person2.b);}
}

运行结果如下:

person1.a: 1
person2.a: 1
person1.b: World
person2.b: Hello

从这个例子可以看出,浅拷贝时,person2的b属性受到了person1变化的影响;而深拷贝时,person2的b属性独立于person1,变化不会相互影响。
总结
深拷贝和浅拷贝在Java中有着明显的区别。深拷贝进行了彻底的复制,无论是基本数据类型还是引用数据类型,都不会受到原对象的影响;而浅拷贝则只是对基本数据类型进行值传递,对引用数据类型进行引用传递,导致对象间的关系仍然存在,容易受到原对象的影响。在实际开发中,我们需要根据不同的场景选择合适的拷贝方式,以满足程序的设计需求。
来源:Java技术栈公众号

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/160501.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

多柱汉诺塔问题

k柱汉诺塔 题目描述 汉诺塔(Hanoi Tower),又称河内塔。 传说大梵天创造世界的时候做了三根金刚石柱子,按左、中、右排序。大梵天在左侧的柱子上,从下往上按照大小顺序摞着64片黄金圆盘,越靠下的圆盘越大。…

个人博客项目 - 测试报告

文章目录 一、项目背景二、测试报告功能测试1.编写测试用例2.登录测试3.编写文章测试4.查看文章测试5.删除文章测试7.注销登录测试 自动化测试性能测试1.VUG2.进行场景设计3.生成性能测试报告 总结 本文开始 一、项目背景 通过学习测试相关的知识,动手实践并测试一…

2023 年 亚太赛 APMCM ABC题 国际大学生数学建模挑战赛 |数学建模完整代码+建模过程全解全析

当大家面临着复杂的数学建模问题时,你是否曾经感到茫然无措?作为2022年美国大学生数学建模比赛的O奖得主,我为大家提供了一套优秀的解题思路,让你轻松应对各种难题。 以五一杯 A题为例子,以下是咱们做的一些想法呀&am…

【Vue】自定义指令

自定义指令 自定义指令就是自己定义的指令,是对 DOM 元素进行底层操作封装 ,程序化地控制 DOM,拓展额外的功能 全局定义 Vue.directive(指令名字, definition) 指令名:不包括v-前缀,使用时候包括v-,v-指令名defini…

CUTLASS 1.3.3中的 Volta884_h884gemm

CUTLASS 是 CUDA C 模板抽象的集合,用于在 CUDA 内的所有级别和规模上实现高性能矩阵-矩阵乘法 (GEMM) 和相关计算。它采用了类似于 cuBLAS 和 cuDNN 中实现的分层分解和数据移动策略。 CUTLASS 最新版本为3.3,相比1.3.3变动较大。然而重温一下1.3.3仍然…

生产问题 Recv-Q101

生产上服务端口 Recv-Q101 新请求到服务器的失败,幸好及时发现,通过重启服务之后得到解决,具体原因等待排查 目前觉得的原因是:某些请求暂用时间比较久

Linux超简单部署个人博客

1 安装halo 1.1 切换到超级用户 sudo -i 1.2 新建halo文件夹 mkdir ~/halo && cd ~/halo 1.3 编辑docker-compose.yml文件 vim ~/halo/docker-compose.yml 英文输入法下,按 i version: "3"services:halo:image: halohub/halo:2.10container_…

2017年全国硕士研究生入学统一考试管理类专业学位联考数学试题——解析版

文章目录 2017 级考研管理类联考数学真题解析一、问题求解(本大题共 5 小题,每小题 3 分,共 45 分)下列每题给出 5 个选项中,只有一个是符合要求的,请在答题卡上将所选择的字母涂黑。真题(2017-…

Python 提高篇学习笔记(一):深拷贝和浅拷贝

文章目录 一、什么是对象的引用二、深拷贝和浅拷贝2.1 浅拷贝(Shallow Copy)2.2 深拷贝(Deep Copy)2.3 copy.copy和copy.deepcopy的区别 一、什么是对象的引用 在 Python 中,对象的引用是指变量指向内存中某个对象的地址或标识符。当你创建一个新的对象(比如一个整…

[技术杂谈]计算机系统硬件类名称

在各种编程语言都可以见到利用WMI查询计算机硬件信息,因此知道有哪些计算机硬件名称非常有必要,下面列举了所有计算机硬件名称可以查询。 本文内容 冷却设备类输入设备类大容量存储类主板、控制器和端口类 显示另外 6 个 计算机系统硬件类别将表示硬…

git修改远程分支名称

先拉取old_branch最新代码到本地 git checkout old_branchgit pull origin old_branch本地修改后并推送 git branch -m old_branch new_branch # 修改分支名称git push --delete origin old_branch # 删除在远程的老分支推送新分支 git push origin new_branch本地分支与远…

除自身以外数组的乘积[中等]

优质博文:IT-BLOG-CN 一、题目 给你一个整数数组nums,返回数组answer,其中answer[i]等于nums中除nums[i]之外其余各元素的乘积。题目数据保证数组nums之中任意元素的全部前缀元素和后缀的乘积都在32位整数范围内。请不要使用除法&#xff0…

【Qt开发流程】之富文本处理

描述 Scribe框架提供了一组类,用于读取和操作结构化的富文本文档。与Qt中以前的富文本支持不同,新的类集中在QTextDocument类上,而不是原始文本信息。这使开发者能够创建和修改结构化的富文本文档,而不必准备中间标记格式的内容。…

【数据结构】A : A DS图_传递信息

A : A DS图_传递信息 Description 小明在和他的小伙伴们玩传消息游戏,游戏规则如下: 有n名玩家,所有玩家编号分别为0~n-1,其中小明编号为0;每个玩家都有固定的若干个可传信息的其他玩家(也可能没有)。传消息的关系是…

busybox制作根文件系统2

上篇内容使用busybox制作好了根文件系统,接下来需要进行一些测试和功能的完善! 根文件系统的测试 测试根文件系统的时候不是直接烧写到EMMC里面,这样测试效率太低了,Ubuntu的rootfs目录已经保存了根文件系统,只需要在…

向量数据库,展望AGI时代

无论是向量数据库,还是大模型,归根结底,大家在追捧它时的心态,焦虑大于需求。 向量数据库的热潮,在一定程度上“外化”了人们的焦虑。 但这并不能否定向量数据库的实际价值,甚至更长远来看,向…

【C++】linux下的gdb程序调试

目录 【C】Linux 下的 GDB 程序调试1. 安装 GDB2. 编译程序3. 启动 GDB4. 设置断点5. 执行程序6. 调试命令7. 调试崩溃8. 结束调试 【C】Linux 下的 GDB 程序调试 在开发 C 程序时,出现 bug 是常见的。调试是找出程序错误的关键步骤之一。在 Linux 环境下&#xff…

RedisTemplate使用详解

RedisTemplate介绍StringRedisTemplate介绍RedisConnectionFactory介绍RedisConnectionFactory源码解析 RedisOperations介绍RedisOperations源码解析 RedisTemplate使用连接池配置RedisTemplate连接池连接池配置 RedisTemplate应用场景RedisTemplate主要特点RedisTemplate使用…

redis运维(十六) 有序集合

一 有序集合 把握一点: 各种redis 命令都提供各种语言对应的API 接口,后续API是关键 ① 概念 1、sorted set --> 有序集合2、redis有序集合也是集合类型的一部分,所以它保留了集合中元素不能重复的特性3、但是不同的是,有序集合给每个元素多设置…

什么是数字孪生?

数字孪生是指通过数字化技术手段,将现实世界中的实体物理系统或过程与其数字化模型相连接,实现实体物理系统或过程的虚拟仿真、监测、预测和优化等功能的一种技术。数字孪生技术可以将物理系统的运行状态、性能参数、故障信息等实时反馈到数字模型中&…