Java对象的深度克隆
文章目录
- 前言
- 代码
- 后记
前言
日常写代码过程中我们需要对数据和对象等进行克隆,然而对引用类型必须要自己重写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对象的深度克隆相关推荐
- java中实现对象的深度克隆
1.什么是深度拷贝和浅拷贝 python中有深度拷贝(也可以叫深度克隆)和浅拷贝,同样在java中很多时候需要深度拷贝对象,所谓的深度拷贝对象指的就是对于对象的所用数据及其全部进行copy一份,变成两 ...
- java中的深度克隆浅克隆_了解Java中的可克隆接口
java中的深度克隆浅克隆 什么是对象克隆? 对象克隆是生成具有不同名称的对象的精确字段到字段副本的过程. 克隆的对象在内存中有自己的空间,可在其中复制原始对象的内容. 这就是为什么在克隆后更改原始对 ...
- 利用序列化与反序列化对Java对象进行深度复制
来源 http://lhg803.iteye.com/blog/407270 JDK的API中的java.lang.Object和Cloneable接口要完美实现深度clone时,都需要针对具体的类 ...
- java序列化与深度克隆
如果类的成员变量比较复杂,例如引用了多个可变引用类型,那么这时使用clone()方法来克隆是非常麻烦的 可以考虑序列化的方法完成克隆 test代码 package com.mingrisoft; im ...
- Java对象克隆方法(浅克隆、深克隆)
要让一个对象进行克隆,其实就是两个步骤: 1. 让该类实现java.lang.Cloneable接口: 2. 重写(override)Object类的clone()方法. 上面的克隆方法其实是浅克隆, ...
- 啥是对象的浅度克隆和深度克隆?
在日常的开发中,我们经常会遇到需要克隆一个对象,对克隆的对象操作之后不影响原有对象以及与之关联的对象 Java的Object类提供了clone方法,用来进行克隆对象,不过JDK提供的clone()方法 ...
- java,对象的克隆
这次写的是有关java对象的克隆 首先是 java对象的假克隆 对于基本类型我们可以用"="来进行克隆,此时对于两个变量除了相等没有其他的关系 但对于引用类型来说就不能简单的使用& ...
- 实现 Cloneable接口深度克隆对象
实现 Cloneable接口深度克隆对象 Body对象中有Head对象,Head对象中有Face对象,Face对象中有int变量和String变量. 实现Boby对象的深度克隆,看下面代码: pack ...
- 对象的深度复制和浅复制 (深度拷贝和浅拷贝)
对象的深度复制和浅复制 (深度拷贝和浅拷贝) 作者:邓家海 时间:2018年2月11日 21:46:22 我们在实际的开发项目里面为了使得开发更加的便捷和方便,总会不经意的使用一些第三方的持久化框架( ...
最新文章
- 如何修改select的样式
- 隔空投送所有人安全吗_Find X2将采用2K+120Hz屏幕,支持65W;安卓将拥有“隔空投送”;“杀毒霸主”Avast被曝偷卖4.35亿用户数据;...
- 美军认知技术发展态势
- 通过案例学调优之--Oracle Cluster Table
- boost::log模块实现将日志记录初始化到远程 syslog 服务器
- HTML页面显示缩略所有空格为一格的方法
- JDK13的六大重要新特性
- VS 2013 C++ 类模板定义与实现 进行分离
- (转)使用Spring的注解方式实现AOP的细节
- 利用wsdl.exe生成webservice代理类
- Luogu1156 垃圾陷阱
- MT4 缠论双线MACD面积背离指标
- redis/memcache监控管理工具——treeNMS
- NOIP2017总结
- 免费又好用怎么把文字转换成语音呢?分享我常用的3个配音神器
- easyui-combobox 选择触发事件 onselect
- Apollo火后,深扒AI+交通产业的生态应用
- Android保存图片到本地或者数据库,并通知相册更新
- EMV(一):初步了解EMV和EMV的分层结构
- Android学习-使用WebView在app上显示网页