文章目录

  • 前言
  • 代码
  • 后记
前言

日常写代码过程中我们需要对数据和对象等进行克隆,然而对引用类型必须要自己重写clone()方法,对于复杂的对象并不那么好写,而且每个对象都需要重写一次。这里我不重写clone()方法,而是使用输入输出流进行克隆。

通常在重写克隆方法时,除非是基础类型(byte/short/int/long/float/double/char/boolean),否则在不做处理的情况下,克隆出的对象其实都只是浅克隆。特别是对于多层嵌套的引用类型,必须对每一层都进行处理,否则最后都是指向同一块内存区域。但是下面的方法可以一劳永逸地解决这个问题。

代码
public void copyTest() throws ClassNotFoundException, IOException {User u1 = new User(1, "yc");User u2 = null;// 使用ByteOutputStream和ObjectOutputStream将对象序列化try (ByteOutputStream bos = new ByteOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(bos);) {// 写入对象oos.writeObject(u1);oos.flush();// 使用ByteArrayInputStream和ObjectInputStream反序列化try (ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(bos.getBytes()));) {// 读取对象u2 = (User) ois.readObject();}}// 修改原对象属性u1.setId(2);u1.setName("zy");System.out.println("u1 = " + u1);System.out.println("u2 = " + u2);
}

输出结果:

后记

该方法由hutool工具类库中的ObjectUtil.cloneByStream(T obj)修改而来,主要是想学习其思想。核心思想都是将对象序列化后再反序列化,所以就要求被克隆必须实现Serializable接口。建议直接使用ObjectUtil.cloneByStream(T obj)

关于深度克隆的推荐文章深入浅出Java中的clone克隆方法,写得太棒了!,顺便文中提到的String类的不可变性Java 中的 String 真的是不可变的吗?

Java对象的深度克隆相关推荐

  1. java中实现对象的深度克隆

    1.什么是深度拷贝和浅拷贝 python中有深度拷贝(也可以叫深度克隆)和浅拷贝,同样在java中很多时候需要深度拷贝对象,所谓的深度拷贝对象指的就是对于对象的所用数据及其全部进行copy一份,变成两 ...

  2. java中的深度克隆浅克隆_了解Java中的可克隆接口

    java中的深度克隆浅克隆 什么是对象克隆? 对象克隆是生成具有不同名称的对象的精确字段到字段副本的过程. 克隆的对象在内存中有自己的空间,可在其中复制原始对象的内容. 这就是为什么在克隆后更改原始对 ...

  3. 利用序列化与反序列化对Java对象进行深度复制

    来源  http://lhg803.iteye.com/blog/407270 JDK的API中的java.lang.Object和Cloneable接口要完美实现深度clone时,都需要针对具体的类 ...

  4. java序列化与深度克隆

    如果类的成员变量比较复杂,例如引用了多个可变引用类型,那么这时使用clone()方法来克隆是非常麻烦的 可以考虑序列化的方法完成克隆 test代码 package com.mingrisoft; im ...

  5. Java对象克隆方法(浅克隆、深克隆)

    要让一个对象进行克隆,其实就是两个步骤: 1. 让该类实现java.lang.Cloneable接口: 2. 重写(override)Object类的clone()方法. 上面的克隆方法其实是浅克隆, ...

  6. 啥是对象的浅度克隆和深度克隆?

    在日常的开发中,我们经常会遇到需要克隆一个对象,对克隆的对象操作之后不影响原有对象以及与之关联的对象 Java的Object类提供了clone方法,用来进行克隆对象,不过JDK提供的clone()方法 ...

  7. java,对象的克隆

    这次写的是有关java对象的克隆 首先是 java对象的假克隆 对于基本类型我们可以用"="来进行克隆,此时对于两个变量除了相等没有其他的关系 但对于引用类型来说就不能简单的使用& ...

  8. 实现 Cloneable接口深度克隆对象

    实现 Cloneable接口深度克隆对象 Body对象中有Head对象,Head对象中有Face对象,Face对象中有int变量和String变量. 实现Boby对象的深度克隆,看下面代码: pack ...

  9. 对象的深度复制和浅复制 (深度拷贝和浅拷贝)

    对象的深度复制和浅复制 (深度拷贝和浅拷贝) 作者:邓家海 时间:2018年2月11日 21:46:22 我们在实际的开发项目里面为了使得开发更加的便捷和方便,总会不经意的使用一些第三方的持久化框架( ...

最新文章

  1. 如何修改select的样式
  2. 隔空投送所有人安全吗_Find X2将采用2K+120Hz屏幕,支持65W;安卓将拥有“隔空投送”;“杀毒霸主”Avast被曝偷卖4.35亿用户数据;...
  3. 美军认知技术发展态势
  4. 通过案例学调优之--Oracle Cluster Table
  5. boost::log模块实现将日志记录初始化到远程 syslog 服务器
  6. HTML页面显示缩略所有空格为一格的方法
  7. JDK13的六大重要新特性
  8. VS 2013 C++ 类模板定义与实现 进行分离
  9. (转)使用Spring的注解方式实现AOP的细节
  10. 利用wsdl.exe生成webservice代理类
  11. Luogu1156 垃圾陷阱
  12. MT4 缠论双线MACD面积背离指标
  13. redis/memcache监控管理工具——treeNMS
  14. NOIP2017总结
  15. 免费又好用怎么把文字转换成语音呢?分享我常用的3个配音神器
  16. easyui-combobox 选择触发事件 onselect
  17. Apollo火后,深扒AI+交通产业的生态应用
  18. Android保存图片到本地或者数据库,并通知相册更新
  19. EMV(一):初步了解EMV和EMV的分层结构
  20. Android学习-使用WebView在app上显示网页

热门文章

  1. vant里面怎么使用import引用_Vant 的引入及使用
  2. 艾伦脑科学研究所,脑图谱,小鼠不同的功能脑区,可视化展示
  3. Java与PHPweb开发比较
  4. 8、10、16进制转2进制最快方法,无需思考,直接写答案
  5. 计算机仿真还给稿费,国内期刊不需要审稿费和版面费汇总
  6. BI, 数据仓库,ETL, 数据开发,有什么区别?
  7. 【大数据】如何将数据导入ClickHouse?
  8. 自然地理学考研复试复习 :绪论
  9. Excel表格中建立树形结构
  10. 第十七届全国大学生智能车竞赛智能视觉组总结