深克隆和浅克隆有什么区别?

news2025/2/22 7:05:41

1、典型回答

克隆是指创建一个对象的副本,使副本具有与原始对象相同的属性和状态。在计算机编程中,克隆是一种常见的操作,用于复制数据、对象或数据结构,以便在不影响原始数据的情况下进行操作、修改或分发。

克降最典型的使用场景是原型模式,原型模式是一种创建型设计模式,用于创建对象的克隆副本,而无需依赖复杂的实例化过程。原型模式通过复制现有对象的原型来创建新的对象,从而避免了通过构造函数创建对象的开销和复杂性。

而克隆又分为深克隆和浅克隆:

深克隆(Deep clone) 是将原型对象中的所有类型,无论是值类型还是引用类型,都复制一份给克降对象,也就是说深克隆会把原型对象和原型对象所引用的对象,都复制一份给克隆对象。

浅克隆(Shadow clone) 是把原型对象中成员变量为值类型的属性都复制给克隆对象,把原型对象中成员变量为引用类型的引用地址也复制给克降对象,也就是原型对象中如果有成员变量为引用对象,则此引用对象的地址是共享给原型对象和克降对象的。简单来说就是浅克隆只会复制原型对象,但不会复制它所引用的对象

深克隆和浅克隆的主要区别: 深克隆会复制原型对象和它所引用所有对象,而浅克隆只会复制原型对象

2、全面剖析

使用克降可以创建对象的克隆副本,而无需进行复杂的实例化过程。克隆分为深克隆和浅克隆,深克隆复制所有类型的属性,而浅克隆只会复制值类型和引用类型的引用地址副本(并未将引用类型本身克隆)

在 Java 中实现克隆,只需要实现 cloneable 接口,并重写 clone 方法即可,如下代码所示:

但在 Java 中,默认的克隆方式是浅克隆,想要实现深克隆需要遍历克隆对象中的所有引用类型成员变量,并对其(引用类型成员变量)也进行克隆操作,如下代码所示:

​​​​​​​​​​​​​​

以上程序的执行结果如下:

原始对象: 小磊,25,北京
克隆对象: 磊哥,30,西安

从上述结果可以看出,引用类型 Address 并不是单纯的复制引用地址,而是这个复制了引用本身,因此修改了person2 之后,并未影响原始对象,说明它是深克隆。  

3、知识扩展

深克降的实现除了可以手动将所有引用类型的属性实现克隆之外,还可以通过以下手动来实现:

  1. 使用序列化和反序列化:将对象写入字节流(序列化),然后从字节流中读取对象(反序列化)。而反序列化的过程,则是创建了一个新的副本对象,并且和原对象一模一样,但属性无论是值类型还是引用类型都是全新的,因此也实现了深克隆。
  2. 使用JSON 工具类实现深克隆:如 Jackson、Gson 或 FastJSON 等,这些JSON 具类本质上还是实现了序列化和反序列化(先将对象转换成JSON 字符,然后再将JSON 字符串转换成新对象),所以这种方式也是深克隆。下面是 Jackson 实现深克隆的示例代码:

以上程序执行结果如下:

3、使用第三方克隆工具类实现深克隆: 如 Apache Commons 库中的 SerializationUtils 类,它的实现代码如下:

 以上程序执行结果如下:

​​​​​​​

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

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

相关文章

Linux -- 线程互斥

一 线程互斥的概念 大部分情况,线程使用的数据都是局部变量,变量的地址空间在线程栈空间内,这种情况,变量归属单个线程,其他线程无法获得这种变量。但有时候,很多变量都需要在线程间共享,这样的…

【网络原理】TCP三次握手四次挥手

文章目录 🌲三次握手四次挥手总览🍀三次握手(建立连接)🌸为什么需要第三次通信 ? 🎄四次挥手(断开连接)🌸四次挥手中涉及到的两个重要的状态 ⭕总结 &#x1…

nginx学习记录-nginx初步配置

1. 虚拟机安装系统并配置网络 系统网上找个能用的镜像就行,我用的是阿里的镜像,地址是centos安装包下载_开源镜像站-阿里云 (aliyun.com) 以下是我本地的虚拟机配置 配置过程中按照提示操作系统即可。 安装好系统后,配置centos的ip&#x…

C++进阶之路---我们在何种情况下使用set和map

顾得泉:个人主页 个人专栏:《Linux操作系统》 《C从入门到精通》 《LeedCode刷题》 键盘敲烂,年薪百万! 前言 在之前的学习中,我们已经接触过STL中的部分容器,比如:vector、list、deque、for…

【多智能体强化学习02---训练范式+独立学习+多智能体策略梯度算法】

文章目录 多智能体强化学习训练和执行范式CTCEDTDECTDE MARL符号表示分布式学习(Independent Learning)基于值函数的分布式学习(Independent value-based learning)基于策略梯度的分布式学习(Independent policy gradient learning) 多智能体…

力扣:数组篇

1、数组理论基础 数组是存放在连续内存空间上的相同类型数据的集合。 需要两点注意的是 数组下标都是从0开始的。数组内存空间的地址是连续的 因为数组的在内存空间的地址是连续的,所以我们在删除或者增添元素的时候,就难免要移动其他元素的地址。 …

LLM之RAG实战(二十九)| 探索RAG PDF解析

对于RAG来说,从文档中提取信息是一种不可避免的场景,确保从源文件中提取出有效的内容对于提高最终输出的质量至关重要。 文件解析过程在RAG中的位置如图1所示: 在实际工作中,非结构化数据比结构化数据丰富得多。如果这些海量数据无…

免费视频背景素材下载

找免费视频素材、背景就上这6个网站,高质量,无版权可商用。 1、菜鸟图库 https://www.sucai999.com/video.html?vNTYwNDUx 菜鸟图库虽然是个设计素材网站,但除了设计类素材之外还有很多视频、音频、办公类等素材,视频素材就有上…

课堂行为动作识别数据集

一共8884张图片 xml .txt格式都有 Yolo可直接训练 已跑通 动作类别一共8类。 全部为教室监控真实照片,没有网络爬虫滥竽充数的图片,可直接用来训练。以上图片均一一手工标注,标签格式为VOC格式。适用于YOLO算法、SSD算法等各种目标检测算法…

自主通用多物理场仿真PaaS平台伏图(Simdroid)及伏图电子散热模块上架华为云商店

随着云计算、大数据等前沿技术的蓬勃发展,国内制造业正面临智能制造转型升级的机遇与挑战。工业软件是制造业研发创新不可或缺的核心工具,《“十四五”智能制造发展规划》中明确了工业软件对于智能制造的核心支撑作用,着重提出加强关键核心技…

DevOps方案中10款最佳开源监控工具

DevOps方案中10款最佳开源监控工具 2024年,监视对现代DevOps团队的工作至关重要。DevOps团队需要可靠且灵活的工具,以有效监视和管理复杂系统,这些系统可以提供有关系统性能、可用性和安全性的实时见解。 开源监控工具由于其成本效益、灵活性和社区支持而日益受到青睐。 …

MySQL教程-SQL

SQL(Structured Query Language)结构化查询语言,操作关系型数据库的编程语言,定义了一套操作关系型数据库统一标准。 语法 SQL语句可以单行或多行书写,以;为结束标记SQL可以使用空格或缩进来增强语句的可读性SQL分单行注释(-- 注释内容 或 …

景略JL5104-N048C 可P2P代替RTL8304MB

话不多说,直接上参数,可免费申请样片上机测试。 JL5104是一个带有RMIl接口的4端口快速以太网交换机。 它支持四级优先级队列的QoS功能,保证了一些实时网络应用的性能。 JL5104集成了一个2k入口地址查找表和一个4路关联散列算法,该…

ios xcode 15 PrivacyInfo.xcprivacy 隐私清单 查询应用使用的隐私api

1.需要升级mac os系统到13 兼容 xcode 15.1 2.升级mac os系统到14 兼容 xcode 15.3 3.选择 New File 4.直接搜索 privacy 能看到有个App Privacy 5.右击Add Row 7.直接选 Label Types 8.选中继续添加就能添加你的隐私清单了 苹果官网文档

稀碎从零算法笔记Day15-LeetCode:判断子序列

跑样例的时候LC炸了,以为今天回断更 题型:字符串、双指针 链接:392. 判断子序列 - 力扣(LeetCode) 来源:LeetCode 题目描述(此题建议结合样例理解) 给定字符串 s 和 t &#xf…

鸿蒙Socket通信示例(TCP通信)

前言 DevEco Studio版本:4.0.0.600 参考链接:OpenHarmony Socket 效果 TCPSocket 1、bind绑定本地IP地址 private bindTcpSocket() {let localAddress resolveIP(wifi.getIpInfo().ipAddress)console.info("111111111 localAddress: " …

性能测试总结 —— 测试流程篇!

本文主要介绍下性能测试的基本流程,性能测试从实际执行层面来看,测试的过程一般分为这么几个阶段,如下图:       下面分别介绍下每个阶段具体需要做什么: 一、性能需求分析: 性能需求分析是整个性能…

【PLC】现场总线和工业以太网汇总

1、 现场总线 1.1 什么是现场总线 1)非专业描述: 如下图:“人机界面”一般通过以太网连接“控制器(PLC)”,“控制器(PLC)”通过 “现场总线”和现场设备连接。 2)专业描述(维基百科) 现场总线…

MTK安卓开发板_联发科开发板评估套件_安卓主板硬件开发

在介绍开发板之前,让我们先来区分一下核心板和开发板的区别。核心板是一种集成度高、功能完整的计算模块,搭载系统,简化了外围接口,体积尺寸相对较小,主要适用于嵌入式系统。而开发板由核心板底板组成,提供…

探索直播美颜SDK的未来发展方向:虚拟现实、增强现实与混合

如今,随着虚拟现实(VR)、增强现实(AR)和混合现实(MR)等技术的不断发展,直播美颜SDK的未来发展方向也将面临着更多的可能性和挑战。今天我将与大家共同探讨直播美颜SDK在虚拟现实、增…