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

简介: 一个工作了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

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

相关文章
|
8月前
|
JSON JavaScript 前端开发
怎么做深拷贝?
怎么做深拷贝?
|
7月前
|
存储 编译器 C++
C++进阶之路:何为拷贝构造函数,深入理解浅拷贝与深拷贝(类与对象_中篇)
C++进阶之路:何为拷贝构造函数,深入理解浅拷贝与深拷贝(类与对象_中篇)
58 0
|
4月前
|
存储 JSON 前端开发
栈在前端中的应用,顺便再了解下深拷贝和浅拷贝!
该文章探讨了栈在前端开发中的应用,并深入讲解了JavaScript中深拷贝与浅拷贝的区别及其实现方法。
栈在前端中的应用,顺便再了解下深拷贝和浅拷贝!
|
6月前
|
前端开发 JavaScript
前端深拷贝、浅拷贝,一起手撕深拷贝
【7月更文挑战第2天】JavaScript中的深拷贝和浅拷贝关乎对象复制的独立性。浅拷贝(如`Object.assign()`、扩展运算符)创建新对象,但共享引用类型属性的内存地址,导致修改新对象会影响原始对象。深拷贝(如递归复制)创建完全独立的对象副本,不受原始对象变动影响。`JSON.parse(JSON.stringify(obj))`是简单的深拷贝方法,但无法处理函数、undefined、Symbol及循环引用。手动实现深拷贝需递归遍历并处理循环引用问题,以确保复制的完整性。理解这两者差异对编写健壮的代码至关重要。
39 0
|
8月前
|
C++
C++什么是深浅拷贝,深浅拷贝的区别?
C++什么是深浅拷贝,深浅拷贝的区别?
|
8月前
|
存储 设计模式
浅克隆和深克隆的详细教程~
浅克隆和深克隆的详细教程~
|
JavaScript
一文弄懂浅拷贝和深拷贝
一文弄懂浅拷贝和深拷贝
58 0
|
设计模式 Java API
一文读懂深克隆与浅克隆的关系
在Java提供的API中,不需要手动创建抽象原型接口,因为Java已经内置了Cloneable抽象原型接口,自定义的类型只需实现该接口并重写Object.clone()方法即可完成本类的复制。 通过查看JDK的源码可以发现,其实Cloneable是一个空接口。Java之所以提供Cloneable接口,只是为了在运行时通知Java虚拟机可以安全地在该类上使用clone()方法。而如果该类没有实现 Cloneable接口,则调用clone()方法会抛出 CloneNotSupportedException异常。 一般情况下,如果使用clone()方法,则需满足以下条件。
78 0
|
人工智能 JavaScript 前端开发
为什么要用深浅拷贝、什么是深浅拷贝、以及如何实现
首先我们要明白一点,js中数据类型分为: 基本数据类型 (Number, String, Boolean, Null, Undefined, Symbol) 对象数据类型 ( Object )** 引用数据类型的值是保存在栈内存和堆内存中的对象。栈区内存保存变量标识符和指向堆内存中该对象的指针。当寻找引用值时,解释器会先寻找栈中的地址。然后根据地址找到堆内存的实体
121 0
为什么要用深浅拷贝、什么是深浅拷贝、以及如何实现
|
存储 JSON 缓存
前端面试:浅拷贝和深拷贝的区别?
前端面试:浅拷贝和深拷贝的区别?
126 0

热门文章

最新文章