java面试常见题:深拷贝与浅拷贝
深拷贝与浅拷贝的区别
浅拷贝只是拷贝了源对象的地址,所以当源对象发生改变时,拷贝的对象的值也会对应发生改变。
深拷贝则是拷贝了源对象的所有值,而不是地址,所以深拷贝对象中的值不会随着源对象中的值的改变而改变。
发生的场景
当如果要拷贝一个A对象,而A对象中又有一个B对象,那么如果对A拷贝的时候,重新拷贝出来一个A1对象并且重新分配内存地址,但是对于A中的B对象,仅仅只是把A1中拷贝出来的B1对象的引用指向原来的B对象而已,并没有把拷贝的B1对象也重新进行分配一个新的内存地址。这就是浅拷贝。
而深拷贝就是在第1的基础上,不仅重新给A1对象分配了新的内存地址,而且还给A1中的B1也重新进行分配了新的内存地址,而不只是仅仅把原本的B的引用给B1。这就是深拷贝。
最基本的实现实现
如果要深拷贝一个对象,那么这个对象必须要实现 Cloneable 接口,实现 重写clone()方法,并且在 clone 方法内部,把该对象引用的其他对象也要 clone 一份,这就要求这个被引用的对象必须也要实现Cloneable 接口并且实现 clone 方法
利用反射机制实现
public static void copy(Object source, Object dest) throws Exception {Class destClz = dest.getClass();// 获取目标的所有成员Field[] destFields = destClz.getDeclaredFields();Object value;for (Field field : destFields) { // 遍历所有的成员,并赋值// 获取value值value = getVal(field.getName(), source);field.setAccessible(true);field.set(dest, value);}
}private static Object getVal(String name, Object obj) throws Exception {try {// 优先获取obj中同名的成员变量Field field = obj.getClass().getDeclaredField(name);field.setAccessible(true);return field.get(obj);} catch (NoSuchFieldException e) {// 表示没有同名的变量}// 获取对应的 getXxx() 或者 isXxx() 方法name = name.substring(0, 1).toUpperCase() + name.substring(1);String methodName = "get" + name;String methodName2 = "is" + name;Method[] methods = obj.getClass().getMethods();for (Method method : methods) {// 只获取无参的方法if (method.getParameterCount() > 0) {continue;}if (method.getName().equals(methodName)|| method.getName().equals(methodName2)) {return method.invoke(obj);}}return null;
}
java面试常见题:深拷贝与浅拷贝相关推荐
- 阿里最全Java面试100题汇总:涵盖天猫、蚂蚁金服等面试题!含答案~
[阿里天猫.蚂蚁.钉钉面试题目] 1.微信红包怎么实现. 2.海量数据分析. 3.测试职位问的线程安全和非线程安全. 4.HTTP2.0.thrift. 5.面试电话沟通可能先让自我介绍. 6.分布式 ...
- java gui中文变方块_150道Java面试基础题(含答案)
1)Java 中能创建 volatile 数组吗? 能,Java 中可以创建 volatile 类型数组,不过只是一个指向数组的引用,而不是整个数组.我的意思是,如果改变引用指向的数组,将会受到 vo ...
- java面试基础题整理(二)
java面试基础题整理 文章目录 java面试基础题整理 前端技术(HTML.CSS.JS.JQuery等) 在js中怎么样验证数字? js中如何给string这个类型加方法? 谈谈js的定时器? 请 ...
- 2021大厂Java面试真题(一)
2021大厂Java面试真题(一) 大厂面试的基本流程 以下是一些大厂面试的基本流程,大家可以参考下: 字节跳动 阿里 腾讯 网易游戏 面试前需要准备: \1. **Java 八股文:**了解常考的题 ...
- 精选 2021 年大厂高频 Java 面试真题集锦(含答案),面试一路开挂
本文涵盖了阿里巴巴.腾讯.字节跳动.京东.华为等大厂的 Java 面试真题,不管你是要面试大厂还是普通的互联网公司,这些面试题对你肯定是有帮助的,毕竟大厂一定是行业的发展方向标杆,很多公司的面试官同样 ...
- 精选2022年大厂高频Java面试真题集锦(含答案),面试一路开挂
本文涵盖了阿里巴巴.腾讯.字节跳动.京东.华为等大厂的Java面试真题,不管你是要面试大厂还是普通的互联网公司,这些面试题对你肯定是有帮助的,毕竟大厂一定是行业的发展方向标杆,很多公司的面试官同样会研 ...
- 最新Java面试300题:腾讯T4面试+美团+京东+拼多多(文末答案附赠)
数据库原理 MYISAM与innodb搜索引擎原理MyISAM引擎使用B+Tree作为索引结构,叶节点的data域存放的是数据记录的地址.其采用索引文件与数据文件,索引文件只存放索引,叶子节点存放数据 ...
- 2021大厂Java面试真题(六)
2021大厂Java面试真题(六) * * 2021 [华为]面试真题* * : * * 1.Java 常用集合及特点?* * List:ArrayList.LinkedList.Vector.Sta ...
- 百度统计 java 实现思路_2019社招阿里、腾讯、蚂蚁金服「四面」Java面试真题分享...
在过去很长一段时间内,国内互联网一直处于三足鼎立状态,BAT即百度.阿里巴巴.腾讯.而在最新的互联网企业价值榜上,百度却被蚂蚁金服挤出前三的位置. 能够进一线互联网公司,是大部分程序员奋斗的目标,有很 ...
最新文章
- 32个笔画顺序表图片_32个笔画掌握透了,练字真的不难
- nodejs中文件,目录的操作(1)
- Redis入门(二)之数据类型
- Apache-DBUtils实现CRUD操作,已封装的API实现jdbc对数据库进行操作
- 万立快速开发平台——软件制作大师
- DotNET:LINQ对泛型(Generic)操作和泛型方法及属性
- 电话机器人源码部署原理及技术难点
- go基础:xml解析
- python3爆破服务器_Python 3.5 之爆破二级域名.
- 5类网线,超5类网线,6类网线,超6类网线的区别
- 最全面的 Fiddler 教程讲解
- 转载:位图和矢量图的区别
- python画三维(3D)图
- php怎么查看qq邮箱,thinkphp实现163、QQ邮箱收发邮件的方法
- layui解决数据表格右侧有空白现象
- python实现tensorrt推理
- DM9000驱动移植在mini2440(linux2.6.29)和FS4412(linux3.14.78)上的实现(deep dive)
- 无盘启动服务器,无盘启动 服务器设置教程
- 七星彩2007年开奖结果_7星彩历年开奖号码(2004年至2020年11月)
- PDF如何转换成TXT文本
热门文章
- php 飘花 特效,jquery+css3实现网页背景花瓣随机飘落特效_javascript技巧
- 关于sync()函数的使用
- csma最短帧长_求计算最短帧长的计算公式。。
- 云上城之歌微信登录服务器,云上城之歌互通版
- [转载] C++文件读写详解(ofstream,ifstream,fstream)
- 错误	LNK2019	无法解析的外部符号 “public: void __cdecl cv::Mat::copyTo(class cv::debug_build_guard::_OutputArray
- Markdown| 在一个句子中间或最后插入对号。 √或×
- unity 检测按钮的点击,按下,抬起
- LoopBar – Tap酒吧与无限滚动
- linux战争雷霆无法运行,战争雷霆Mac版下载及运行问题汇总 苹果OSX系统怎么运行战雷...