谈谈你对深克隆和浅克隆的理解

简介: 一个工作了5年的程序员私信我说,前几天去阿里面试被问到这样一个这样的面试题,说谈谈你对深克隆和浅克隆的理解。他回答说深克隆是克隆值,浅克隆是克隆引用,当时他只说了这样一句话,回答完以后,他看到面试官的表情很诧异,面试也没有继续深入追问了。小伙伴们,如果是你来回答,你也会这样回回答吗?

一个工作了5年的程序员私信我说,前几天去阿里面试被问到这样一个这样的面试题,说谈谈你对深克隆和浅克隆的理解。他回答说深克隆是克隆值,浅克隆是克隆引用,当时他只说了这样一句话,回答完以后,他看到面试官的表情很诧异,面试也没有继续深入追问了。小伙伴们,如果是你来回答,你也会这样回回答吗?

这位小伙伴的回答并没有错,只是面试官觉得回答得有点抽象而已。今天,我给大家详细聊一聊。

另外,我花了1个多星期把往期的面试题解析配套文档准备好了,想获取的小伙伴可以在我的煮叶简介中找到。

说到克隆啊,我还不得不说到一个设计模式,原型模式。先来看原型模式的定义。

1、原型模式定义

原型模式的官方原文是这样的:

c1d9ceb9927511ff33b0365a7e805d07.jpg

大致意思是,指原型实例指定创建对象的种类,并且通过复制这些原型创建新的对象。其实复制、克隆、拷贝表达的都是同一个意思。因为Java中的数据类型分为引用类型和值类型,因此,在克隆数据的过程中,就有了深克隆和浅克隆。

2、深克隆和浅克隆

那么,深克隆和浅克隆的本质区别又是什么呢?我归纳为以下两点:

第1点:看数据拷贝后两者之间是否有关联。

第2点:改变一个值是否会影响到另一个值变化。

dc3505f609e0955cbe56d50ff355af84.jpg

那么,到底什么是深克隆,什么是浅克隆呢?

先来看浅克隆,浅克隆就是数据拷贝后,一方数据变化另一方会跟着变化。

如图所示:有原型对象Object,它是引用类型,然后拷贝后产生两个克隆对象obj1和obj2,只是它们克隆的是Object的内存地址,因此ob1和obj2都指向Object,那么Object中的成员变量值发生改变时,obj1和obj2指向的成员变量值也就会发生改变。

b5f9dbc401319b16782316adf7afdfd3.jpg

实现浅克隆的常用API有以下3种,

1、工具类BeanUtils和PropertyUtils,BeanUtils是Spring提供的,PropertyUtils是Apache的commons包中提供的。

2、实现Clonenable接口

3、Arrays的copyOf()方法

a0223ca72a56c03248e99cde4d0e0a00.jpg

下面来看深克隆,深克隆就是数据拷贝后,原型对象和克隆对象之间没有关联。如图所示:obj1和obj2分别指向不同的原型对象,拷贝的是值不是内存地址。

0e9cf0e7b29e444862e5f2d799d6ac88.jpg

深克隆常用的API有以下5种:

1、重写clone()方法

2、序列化

3、Apache commons工具包中的SerializationUtils的clone()方法

4、JSON工具类

5、通过构造方法手动new对象。

442387f3231bcaccd506598c161f9677.jpg

以上就是我对浅克隆和深克隆的理解。

相关文章
|
存储 JavaScript 前端开发
什么是堆?什么是栈?他们之间从区别和联系
什么是堆?什么是栈?他们之间从区别和联系
489 0
|
缓存 NoSQL 数据库
探秘Redis读写策略:CacheAside、读写穿透、异步写入
本文介绍了 Redis 的三种高可用性读写模式:CacheAside、Read/Write Through 和 Write Behind Caching。CacheAside 简单易用,但可能引发数据不一致;Read/Write Through 保证数据一致性,但性能可能受限于数据库;Write Behind Caching 提高写入性能,但有数据丢失风险。开发者应根据业务需求选择合适模式。
1768 2
探秘Redis读写策略:CacheAside、读写穿透、异步写入
|
10月前
|
缓存 监控 Linux
掌握Linux性能分析:深入探索perf工具
【10月更文挑战第26天】
463 1
|
机器学习/深度学习 运维 算法
无监督学习的12个最重要的算法介绍及其用例总结
无监督学习的12个最重要的算法介绍及其用例总结
729 5
|
11月前
|
NoSQL 关系型数据库 MySQL
MySQL与Redis协同作战:百万数据量的优化实录
【10月更文挑战第6天】 在现代互联网应用中,随着用户量的增加和业务逻辑的复杂化,数据量级迅速增长,这对后端数据库系统提出了严峻的挑战。尤其是当数据量达到百万级别时,传统的数据库解决方案往往会遇到性能瓶颈。本文将分享一次使用MySQL与Redis协同优化大规模数据统计的实战经验。
523 3
|
机器学习/深度学习 人工智能 自然语言处理
【AI大模型】Transformers大模型库(十):repetition_penalty惩罚系数
【AI大模型】Transformers大模型库(十):repetition_penalty惩罚系数
375 0
|
存储 分布式计算 大数据
使用 Java 进行大数据处理和分析
【4月更文挑战第19天】本文探讨了Java在大数据处理中的关键作用,涉及Hadoop框架、HDFS数据存储、MapReduce编程模型及Spark等数据分析工具。还包括数据预处理、可视化、性能优化、安全与隐私保护以及完整处理流程。Java在金融、医疗、电商等领域有广泛应用,为大数据洞察和决策提供支持,但同时也需要开发者具备深厚的技术背景和实践经验。
864 2
|
机器学习/深度学习 人工智能 安全
智能之网:探索AI在物联网中的应用与挑战
随着科技的飞速发展,人工智能(AI)已经渗透到我们生活的方方面面,特别是在物联网(IoT)领域的应用日益广泛。本文将探讨AI技术如何在物联网中发挥作用,提升设备智能化水平,优化数据管理,以及在实现这一过程中遇到的技术、安全和伦理等挑战。通过分析具体案例,我们将揭示AI和物联网结合带来的创新机遇及其对未来社会可能产生的影响。
|
机器学习/深度学习 人工智能 算法
构建高效AI系统:深度学习优化技术解析
【5月更文挑战第12天】 随着人工智能技术的飞速发展,深度学习已成为推动创新的核心动力。本文将深入探讨在构建高效AI系统中,如何通过优化算法、调整网络结构及使用新型硬件资源等手段显著提升模型性能。我们将剖析先进的优化策略,如自适应学习率调整、梯度累积技巧以及正则化方法,并讨论其对模型训练稳定性和效率的影响。文中不仅提供理论分析,还结合实例说明如何在实际项目中应用这些优化技术。
|
Kubernetes 调度 容器
Kubernetes容器资源限制
Kubernetes容器资源限制
198 0