问题:怎么样实现对一个对象的深拷贝

使用深拷贝的方法有点难实现啊。要保证原来的对象和克隆对象不是共享同一个引用的步骤是什么啊?

回答一

一种安全的方法是先序列化对象,然后反序列化。这保证了所有东西都是一个新的引用。

这里有一篇关于如何高效实现这个的文章。

注意:类可能会重写序列化的方法,这样就不会创建新的实例,例如对于单例来说,如果你的类不是可序列化的,这当然也不会生效啦。

回答二

实现深拷贝的一种方法是向每个关联的类添加复制构造函数。一个复制构造函数接受’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

怎么样实现对一个对象的深拷贝相关推荐

  1. 如何对一个对象进行深拷贝

    前面说了如何对一个对象进行浅拷贝,本文来说下如何对一个对象进行深拷贝. 文章目录 概述 拷贝对象 方法一 构造函数 方法二 重载clone()方法 方法三 Apache Commons Lang序列化 ...

  2. Java如何对一个对象进行深拷贝?

    在Java语言里,当我们需要拷贝一个对象时,有两种类型的拷贝:浅拷贝与深拷贝.浅拷贝只是拷贝了源对象的地址,所以源对象的值发生变化时,拷贝对象的值也会发生变化.而深拷贝则是拷贝了源对象的所有值,所以即 ...

  3. 深入浅出的“深拷贝与浅拷贝”

    js中的浅拷贝与深拷贝,只是针对复杂数据类型(object, Array)的复制问题.浅拷贝和深拷贝都可以实现在已有对象上再生出一份的作用.但是对象的实例是存储在堆内存中然后通过一个引用值只操作对象, ...

  4. Java的深拷贝和浅拷贝

     熟悉C++的朋友对这个话题应该很熟悉,浅拷贝就是指两个对象共同拥有同一个值,一个对象改变了该值,也会影响到另一个对象.深拷贝就是两个对象的值相等,但是互相独立.本来想把以前写的一篇文章扩充一下,没想 ...

  5. python函数方法里面用浅复制深复制_图解 Python 浅拷贝与深拷贝

    Python 中的赋值语句不会创建对象的拷贝,仅仅只是将名称绑定至一个对象.对于不可变对象,通常没什么差别,但是处理可变对象或可变对象的集合时,你可能需要创建这些对象的 "真实拷贝" ...

  6. 什么是深拷贝和浅拷贝?以及怎么实现深拷贝和浅拷贝?

    拷贝浅是创建一个新对象,这个对象有着原始对象属性值的一份精确拷贝.如果属性是基本类型,拷贝的就是基本类型的值,如果属性是引用类型,拷贝的就是内存地址,所以如果其中一个对象改变了这个地址,就会影响到另一 ...

  7. 深拷贝的五种实现方式

    一.什么是深拷贝和浅拷贝 浅拷贝是创建一个新对象,这个对象有着原始对象属性值的一份精确拷贝.如果属性是基本类型,拷贝的就是基本类型的值,如果属性是引用类型,拷贝的就是指向内存的地址 ,所以如果其中一个 ...

  8. 智能指针深拷贝浅拷贝

    智能指针 将原生指针封装成对象,来解决堆上内存泄漏的问题. 为什么要使用智能指针: 智能指针的作用是管理一个指针,因为存在以下这种情况:申请的空间在函数结束时忘记释放,造成内存泄漏.使用智能指针可以很 ...

  9. 有关深拷贝浅拷贝(经典前端面试题)

    文章目录 拷贝的定义 基本类型和引用类型 简单说一下什么是堆什么是栈 你在什么时候使用过深拷贝/浅拷贝呢? 拷贝的定义 拷贝:复制.Ctrl+C.搞一份一样的东西出来. 深拷贝:开辟一个新的空间,将原 ...

最新文章

  1. 一个form表单,多个提交按钮(实现不同功能和地址的提交)
  2. AngularJS快速入门
  3. 一种简单的redis分布式锁方案
  4. Go 读取 yaml 文件并解析
  5. Flask实战2问答平台-发布问答界面完成
  6. Oracle 原理:序列
  7. [BUUCTF-pwn]——picoctf_2018_shellcode
  8. linux cp源码_为Linux的cp和mv命令添加进度条
  9. W ndows95安装,Windows 95的安装
  10. 分析股票大数据_Python大数据分析量学祖师爷网站数据
  11. slice,Array.prototype.slice,Array.protyotype.slice.call
  12. python时间格式转换为美式日期_如何将日期时间格式的排列转换为python中的打印?...
  13. Oracle REGEXP_SUBSTR 字符串截取函数的使用
  14. MATLAB 不能保存变量问题及解决办法
  15. AcWing 851. spfa求最短路(解决负边权最短路)
  16. 鸿蒙os系统使用技巧,鸿蒙OS系统的四大技术特性介绍
  17. 单目标决策---决策的分类
  18. java并发包aqu_Java并发包之SynchronousQueue
  19. java窗口设计_JAVA界面设计
  20. 【Proteus仿真】51单片机+红外测距仪(GP2D12)+ADC0809模数转换

热门文章

  1. 栈空间和堆空间的区别
  2. 1082 射击比赛 (20 分)
  3. 腾讯,字节,阿里,小米,京东大厂Offer拿到手软!讲的明明白白!
  4. aspnetcore源码学习(一)
  5. 第五百一十八天 how can I 坚持
  6. 初识virtual memory
  7. 为什么下了android 4.1 的SDK后在本地用浏览器看api说明文档时,浏览器打开api的html文件很慢?试了好几款浏览器都一样。为什么?...
  8. elk docker
  9. CentOS7下分布式文件系统FastDFS的安装 配置 (单节点)
  10. JPDA 架构研究5 - Agent利用环境指针访问VM (内存管理篇)