浅析Java中的深拷贝与浅拷贝
来源:互联网 发布:java 哈希与map 编辑:程序博客网 时间:2024/05/16 00:53
原文:http://java.chinaitlab.com/oop/784559.html
首先我们看看浅拷贝和深拷贝的定义
浅拷贝:只复制一个对象,对象内部存在的指向其他对象数组或者引用则不复制
深拷贝:对象,对象内部的引用均复制
为了更好的理解它们的区别我们假设有一个对象A,它包含有2对象对象A1和对象A2
对象A进行浅拷贝后,得到对象B但是对象A1和A2并没有被拷贝
对象A进行深拷贝,得到对象B的同时A1和A2连同它们的引用也被拷贝
在理解了深拷贝和浅拷贝后,我们来看看Java的深拷贝和浅拷贝实现。java.lang.Object的clone()方法默认是返回一个前拷贝对象。因此如果要用clone()方法实现一个深拷贝,我们必须对每个对象的clone()方法进行特别实现。当对象层次复杂的时候,这样做不但困难而且浪费时间和容易出现错误,特别有时候你不但需要深拷贝同时你也对这个对象进行浅拷贝的时候,你会发现写这个clone()方法真不是一个好的解决方案。
那么除了clone()方法,我们还可以怎么实现呢?答案是序列化,实现步骤和思路是把要拷贝的对象输出成byte array,然后再利用ObjectInputStream转换出新的对象。下面是代码
public static Object copy(Object oldObj) { Object obj = null; try { // Write the object out to a byte array ByteArrayOutputStream bos = new ByteArrayOutputStream(); ObjectOutputStream out = new ObjectOutputStream(bos); out.writeObject(oldObj); out.flush(); out.close(); // Retrieve an input stream from the byte array and read // a copy of the object back in. ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray()); ObjectInputStream in = new ObjectInputStream(bis); obj = in.readObject(); } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException cnfe) { cnfe.printStackTrace(); } return obj; }
- 浅析Java中的深拷贝与浅拷贝
- 浅析Java中的深拷贝与浅拷贝
- java中的深拷贝与浅拷贝
- Java中的浅拷贝与深拷贝
- java 中的深拷贝与浅拷贝
- java中的深拷贝与浅拷贝
- Java中的深拷贝与浅拷贝
- Java中的浅拷贝与深拷贝
- Java中的深拷贝与浅拷贝
- Java 中的浅拷贝与深拷贝
- 浅析C#深拷贝与浅拷贝
- 浅析C#深拷贝与浅拷贝
- 浅析C#深拷贝与浅拷贝
- 浅析C#深拷贝与浅拷贝
- C++ 浅拷贝与深拷贝浅析
- 浅析C#深拷贝与浅拷贝
- 浅析C#深拷贝与浅拷贝
- 浅析C#深拷贝与浅拷贝
- hibernate3中出现 could not initialize proxy - no Session 错误的解决办法以及lazy load的介绍
- Linux操作系统下C++编程初探
- C++中的空类,默认产生哪些类成员函数? 转
- onNewIntent调用时机
- 数字集群通信的业务与功能
- 浅析Java中的深拷贝与浅拷贝
- 三个故事说出的人生哲理
- ExecutorCompletionService
- 删除Eclipse 的 open Perspective 多余的菜单
- Chrome 图片批量下载扩展—— zzllrr Imager(小乐图客)
- javascript_重载浏览器默认行为
- C++文件操作总结
- lvm下增加磁盘
- JXL太消耗内存了