怎么样实现对一个对象的深拷贝
问题:怎么样实现对一个对象的深拷贝
使用深拷贝的方法有点难实现啊。要保证原来的对象和克隆对象不是共享同一个引用的步骤是什么啊?
回答一
一种安全的方法是先序列化对象,然后反序列化。这保证了所有东西都是一个新的引用。
这里有一篇关于如何高效实现这个的文章。
注意:类可能会重写序列化的方法,这样就不会创建新的实例,例如对于单例来说,如果你的类不是可序列化的,这当然也不会生效啦。
回答二
实现深拷贝的一种方法是向每个关联的类添加复制构造函数。一个复制构造函数接受’this’的一个实例作为其单个参数,并从这个实例中复制所有值。这函数要干非常多的工作,但是也是非常直接和安全。
编辑:注意你不需要使用访问方法来读取属性。你可以直接访问所有属性,因为源实例总是与具有复制构造函数的实例具有相同的类型。这是很明显的,但可能会被忽视了。
例子:
public class Order {private long number;public Order() {}/*** Copy constructor*/public Order(Order source) {number = source.number;}
}public class Customer {private String name;private List<Order> orders = new ArrayList<Order>();public Customer() {}/*** Copy constructor*/public Customer(Customer source) {name = source.name;for (Order sourceOrder : source.orders) {orders.add(new Order(sourceOrder));}}public String getName() {return name;}public void setName(String name) {this.name = name;}
}
注意,如果复制构造函数的话,你需要知道你复制的那个对象运行的时候是什么类型的。所以上面的方法,你不能简单第用来复制一个混合类型的list(你要用一些反射的代码去完成)
文章翻译自Stack Overflow:https://stackoverflow.com/questions/64036/how-do-you-make-a-deep-copy-of-an-object
怎么样实现对一个对象的深拷贝相关推荐
- 如何对一个对象进行深拷贝
前面说了如何对一个对象进行浅拷贝,本文来说下如何对一个对象进行深拷贝. 文章目录 概述 拷贝对象 方法一 构造函数 方法二 重载clone()方法 方法三 Apache Commons Lang序列化 ...
- Java如何对一个对象进行深拷贝?
在Java语言里,当我们需要拷贝一个对象时,有两种类型的拷贝:浅拷贝与深拷贝.浅拷贝只是拷贝了源对象的地址,所以源对象的值发生变化时,拷贝对象的值也会发生变化.而深拷贝则是拷贝了源对象的所有值,所以即 ...
- 深入浅出的“深拷贝与浅拷贝”
js中的浅拷贝与深拷贝,只是针对复杂数据类型(object, Array)的复制问题.浅拷贝和深拷贝都可以实现在已有对象上再生出一份的作用.但是对象的实例是存储在堆内存中然后通过一个引用值只操作对象, ...
- Java的深拷贝和浅拷贝
熟悉C++的朋友对这个话题应该很熟悉,浅拷贝就是指两个对象共同拥有同一个值,一个对象改变了该值,也会影响到另一个对象.深拷贝就是两个对象的值相等,但是互相独立.本来想把以前写的一篇文章扩充一下,没想 ...
- python函数方法里面用浅复制深复制_图解 Python 浅拷贝与深拷贝
Python 中的赋值语句不会创建对象的拷贝,仅仅只是将名称绑定至一个对象.对于不可变对象,通常没什么差别,但是处理可变对象或可变对象的集合时,你可能需要创建这些对象的 "真实拷贝" ...
- 什么是深拷贝和浅拷贝?以及怎么实现深拷贝和浅拷贝?
拷贝浅是创建一个新对象,这个对象有着原始对象属性值的一份精确拷贝.如果属性是基本类型,拷贝的就是基本类型的值,如果属性是引用类型,拷贝的就是内存地址,所以如果其中一个对象改变了这个地址,就会影响到另一 ...
- 深拷贝的五种实现方式
一.什么是深拷贝和浅拷贝 浅拷贝是创建一个新对象,这个对象有着原始对象属性值的一份精确拷贝.如果属性是基本类型,拷贝的就是基本类型的值,如果属性是引用类型,拷贝的就是指向内存的地址 ,所以如果其中一个 ...
- 智能指针深拷贝浅拷贝
智能指针 将原生指针封装成对象,来解决堆上内存泄漏的问题. 为什么要使用智能指针: 智能指针的作用是管理一个指针,因为存在以下这种情况:申请的空间在函数结束时忘记释放,造成内存泄漏.使用智能指针可以很 ...
- 有关深拷贝浅拷贝(经典前端面试题)
文章目录 拷贝的定义 基本类型和引用类型 简单说一下什么是堆什么是栈 你在什么时候使用过深拷贝/浅拷贝呢? 拷贝的定义 拷贝:复制.Ctrl+C.搞一份一样的东西出来. 深拷贝:开辟一个新的空间,将原 ...
最新文章
- 一个form表单,多个提交按钮(实现不同功能和地址的提交)
- AngularJS快速入门
- 一种简单的redis分布式锁方案
- Go 读取 yaml 文件并解析
- Flask实战2问答平台-发布问答界面完成
- Oracle 原理:序列
- [BUUCTF-pwn]——picoctf_2018_shellcode
- linux cp源码_为Linux的cp和mv命令添加进度条
- W ndows95安装,Windows 95的安装
- 分析股票大数据_Python大数据分析量学祖师爷网站数据
- slice,Array.prototype.slice,Array.protyotype.slice.call
- python时间格式转换为美式日期_如何将日期时间格式的排列转换为python中的打印?...
- Oracle REGEXP_SUBSTR 字符串截取函数的使用
- MATLAB 不能保存变量问题及解决办法
- AcWing 851. spfa求最短路(解决负边权最短路)
- 鸿蒙os系统使用技巧,鸿蒙OS系统的四大技术特性介绍
- 单目标决策---决策的分类
- java并发包aqu_Java并发包之SynchronousQueue
- java窗口设计_JAVA界面设计
- 【Proteus仿真】51单片机+红外测距仪(GP2D12)+ADC0809模数转换
热门文章
- 栈空间和堆空间的区别
- 1082 射击比赛 (20 分)
- 腾讯,字节,阿里,小米,京东大厂Offer拿到手软!讲的明明白白!
- aspnetcore源码学习(一)
- 第五百一十八天 how can I 坚持
- 初识virtual memory
- 为什么下了android 4.1 的SDK后在本地用浏览器看api说明文档时,浏览器打开api的html文件很慢?试了好几款浏览器都一样。为什么?...
- elk docker
- CentOS7下分布式文件系统FastDFS的安装 配置 (单节点)
- JPDA 架构研究5 - Agent利用环境指针访问VM (内存管理篇)