深拷贝与浅拷贝的区别

浅拷贝只是拷贝了源对象的地址,所以当源对象发生改变时,拷贝的对象的值也会对应发生改变。
深拷贝则是拷贝了源对象的所有值,而不是地址,所以深拷贝对象中的值不会随着源对象中的值的改变而改变。

发生的场景

当如果要拷贝一个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面试常见题:深拷贝与浅拷贝相关推荐

  1. 阿里最全Java面试100题汇总:涵盖天猫、蚂蚁金服等面试题!含答案~

    [阿里天猫.蚂蚁.钉钉面试题目] 1.微信红包怎么实现. 2.海量数据分析. 3.测试职位问的线程安全和非线程安全. 4.HTTP2.0.thrift. 5.面试电话沟通可能先让自我介绍. 6.分布式 ...

  2. java gui中文变方块_150道Java面试基础题(含答案)

    1)Java 中能创建 volatile 数组吗? 能,Java 中可以创建 volatile 类型数组,不过只是一个指向数组的引用,而不是整个数组.我的意思是,如果改变引用指向的数组,将会受到 vo ...

  3. java面试基础题整理(二)

    java面试基础题整理 文章目录 java面试基础题整理 前端技术(HTML.CSS.JS.JQuery等) 在js中怎么样验证数字? js中如何给string这个类型加方法? 谈谈js的定时器? 请 ...

  4. 2021大厂Java面试真题(一)

    2021大厂Java面试真题(一) 大厂面试的基本流程 以下是一些大厂面试的基本流程,大家可以参考下: 字节跳动 阿里 腾讯 网易游戏 面试前需要准备: \1. **Java 八股文:**了解常考的题 ...

  5. 精选 2021 年大厂高频 Java 面试真题集锦(含答案),面试一路开挂

    本文涵盖了阿里巴巴.腾讯.字节跳动.京东.华为等大厂的 Java 面试真题,不管你是要面试大厂还是普通的互联网公司,这些面试题对你肯定是有帮助的,毕竟大厂一定是行业的发展方向标杆,很多公司的面试官同样 ...

  6. 精选2022年大厂高频Java面试真题集锦(含答案),面试一路开挂

    本文涵盖了阿里巴巴.腾讯.字节跳动.京东.华为等大厂的Java面试真题,不管你是要面试大厂还是普通的互联网公司,这些面试题对你肯定是有帮助的,毕竟大厂一定是行业的发展方向标杆,很多公司的面试官同样会研 ...

  7. 最新Java面试300题:腾讯T4面试+美团+京东+拼多多(文末答案附赠)

    数据库原理 MYISAM与innodb搜索引擎原理MyISAM引擎使用B+Tree作为索引结构,叶节点的data域存放的是数据记录的地址.其采用索引文件与数据文件,索引文件只存放索引,叶子节点存放数据 ...

  8. 2021大厂Java面试真题(六)

    2021大厂Java面试真题(六) * * 2021 [华为]面试真题* * : * * 1.Java 常用集合及特点?* * List:ArrayList.LinkedList.Vector.Sta ...

  9. 百度统计 java 实现思路_2019社招阿里、腾讯、蚂蚁金服「四面」Java面试真题分享...

    在过去很长一段时间内,国内互联网一直处于三足鼎立状态,BAT即百度.阿里巴巴.腾讯.而在最新的互联网企业价值榜上,百度却被蚂蚁金服挤出前三的位置. 能够进一线互联网公司,是大部分程序员奋斗的目标,有很 ...

最新文章

  1. 32个笔画顺序表图片_32个笔画掌握透了,练字真的不难
  2. nodejs中文件,目录的操作(1)
  3. Redis入门(二)之数据类型
  4. Apache-DBUtils实现CRUD操作,已封装的API实现jdbc对数据库进行操作
  5. 万立快速开发平台——软件制作大师
  6. DotNET:LINQ对泛型(Generic)操作和泛型方法及属性
  7. 电话机器人源码部署原理及技术难点
  8. go基础:xml解析
  9. python3爆破服务器_Python 3.5 之爆破二级域名.
  10. 5类网线,超5类网线,6类网线,超6类网线的区别
  11. 最全面的 Fiddler 教程讲解
  12. 转载:位图和矢量图的区别
  13. python画三维(3D)图
  14. php怎么查看qq邮箱,thinkphp实现163、QQ邮箱收发邮件的方法
  15. layui解决数据表格右侧有空白现象
  16. python实现tensorrt推理
  17. DM9000驱动移植在mini2440(linux2.6.29)和FS4412(linux3.14.78)上的实现(deep dive)
  18. 无盘启动服务器,无盘启动 服务器设置教程
  19. 七星彩2007年开奖结果_7星彩历年开奖号码(2004年至2020年11月)
  20. PDF如何转换成TXT文本

热门文章

  1. php 飘花 特效,jquery+css3实现网页背景花瓣随机飘落特效_javascript技巧
  2. 关于sync()函数的使用
  3. csma最短帧长_求计算最短帧长的计算公式。。
  4. 云上城之歌微信登录服务器,云上城之歌互通版
  5. [转载] C++文件读写详解(ofstream,ifstream,fstream)
  6. 错误 LNK2019 无法解析的外部符号 “public: void __cdecl cv::Mat::copyTo(class cv::debug_build_guard::_OutputArray
  7. Markdown| 在一个句子中间或最后插入对号。 √或×
  8. unity 检测按钮的点击,按下,抬起
  9. LoopBar – Tap酒吧与无限滚动
  10. linux战争雷霆无法运行,战争雷霆Mac版下载及运行问题汇总 苹果OSX系统怎么运行战雷...