谈谈你对深克隆和浅克隆的理解
一个工作了5年的程序员私信我说,前几天去阿里面试被问到这样一个这样的面试题,说谈谈你对深克隆和浅克隆的理解。他回答说深克隆是克隆值,浅克隆是克隆引用,当时他只说了这样一句话,回答完以后,他看到面试官的表情很诧异,面试也没有继续深入追问了。小伙伴们,如果是你来回答,你也会这样回回答吗?
这位小伙伴的回答并没有错,只是面试官觉得回答得有点抽象而已。今天,我给大家详细聊一聊。
另外,我花了1个多星期把往期的面试题解析配套文档准备好了,想获取的小伙伴可以看我的煮叶简介!
说到克隆啊,我还不得不说到一个设计模式,原型模式。先来看原型模式的定义。
1、原型模式定义
原型模式的官方原文是这样的:
大致意思是,指原型实例指定创建对象的种类,并且通过复制这些原型创建新的对象。其实复制、克隆、拷贝表达的都是同一个意思。因为Java中的数据类型分为引用类型和值类型,因此,在克隆数据的过程中,就有了深克隆和浅克隆。
2、深克隆和浅克隆
那么,深克隆和浅克隆的本质区别又是什么呢?我归纳为以下两点:
第1点:看数据拷贝后两者之间是否有关联。
第2点:改变一个值是否会影响到另一个值变化。
那么,到底什么是深克隆,什么是浅克隆呢?
先来看浅克隆,浅克隆就是数据拷贝后,一方数据变化另一方会跟着变化。
如图所示:有原型对象Object,它是引用类型,然后拷贝后产生两个克隆对象obj1和obj2,只是它们克隆的是Object的内存地址,因此ob1和obj2都指向Object,那么Object中的成员变量值发生改变时,obj1和obj2指向的成员变量值也就会发生改变。
实现浅克隆的常用API有以下3种,
1、工具类BeanUtils和PropertyUtils,BeanUtils是Spring提供的,PropertyUtils是Apache的commons包中提供的。
2、实现Clonenable接口
3、Arrays的copyOf()方法
下面来看深克隆,深克隆就是数据拷贝后,原型对象和克隆对象之间没有关联。如图所示:obj1和obj2分别指向不同的原型对象,拷贝的是值不是内存地址。
深克隆常用的API有以下5种:
1、重写clone()方法
2、序列化
3、Apache commons工具包中的SerializationUtils的clone()方法
4、JSON工具类
5、通过构造方法手动new对象。
以上就是我对浅克隆和深克隆的理解。
我是被编程耽误的文艺Tom,如果我的分享对你有帮助,关注我的煮叶,面试不再难!
本文为“Tom弹架构”原创,转载请注明出处。技术在于分享,我分享我快乐!\ 如果本文对您有帮助,欢迎关注和点赞;如果您有任何建议也可留言评论或私信,您的支持是我坚持创作的动力。 关注微信公众号『 Tom弹架构 』回复“666”可获取200页的PDF面试文档!
我是被编程耽误的文艺Tom
- 使用桥接模式设计复杂的消息系统
- 为什么MySQL索引结构采用B 树?
- 为什么Netty线程池默认大小为CPU核数的2倍
- 谈谈你对深克隆和浅克隆的理解
- 什么是代理,为什么要用动态代理?
- 什么是零拷贝,Netty是如何实现的?
- 3分钟轻松理解单线程下的HashMap工作原理
- 被面试官问烂的Spring AOP原理,你是怎么答的?
- Spring为何需要三级缓存解决循环依赖,而不是二级缓存?
- 为什么Spring中每个Bean都要定义作用域?
- 谈谈你对Spring Bean的理解
- 趣谈装饰器模式,让你一辈子不会忘
- 掌握这些招数,你也能写出HR眼中的高分简历
- MongoDB高级应用之数据转存与恢复(5)
- 图解MongoDB集群部署原理(3)
- 爆肝30天,肝出来史上最透彻Spring原理和27道高频面试题总结
- Spring核心原理之IoC容器初体验(2)
- Spring核心原理分析之MVC九大组件(1)
- 30个类手写Spring核心原理之动态数据源切换(8)
- 【紧急】Log4j又发新版2.17.0,只有彻底搞懂漏洞原因,才能以不变应万变,小白也能看懂