关于对象的深度复制和浅度复制
来源:互联网 发布:亚马逊数据库主从 编辑:程序博客网 时间:2024/05/24 15:36
java深度clone比较全面的帖子:http://blog.csdn.net/randyjiawenjie/article/details/7563323
概念
深度复制:内容一致,内容对象不一致,也就是说对象时新创建的对象
浅度复制:内容一致,内容对象一致
场景
例如以HashMap对象为例,实现复制有三种方式:
1、Cloneable对象来使用clone;
2、putAll方式
3、対向流copy
方式一、clone
import java.io.Serializable;public class MySerializable implements Serializable {private int id;public int getId() {return id;}public void setId(int id) {this.id = id;}}
测试代码如下
import java.util.HashMap;public class SerializableDeepCopy {public static void main(String[] args) {HashMap<String, MySerializable> mySerializableMap = new HashMap<String, MySerializable>();MySerializable ms = new MySerializable();ms.setId(1);mySerializableMap.put("test", ms);HashMap<String, MySerializable> mySerializableMapClone = (HashMap<String, MySerializable>) mySerializableMap.clone();if (mySerializableMap == mySerializableMapClone) {System.out.println("mySerializableMap == mySerializableMapClone");} else {System.out.println("mySerializableMap != mySerializableMapClone");}if (mySerializableMap.get("test") == mySerializableMapClone.get("test")) {System.out.println("mySerializableMap test value == mySerializableMapClone test value");} else {System.out.println("mySerializableMap test value != mySerializableMapClone test value");}}}系统输出结果:
mySerializableMap != mySerializableMapClonemySerializableMap test value == mySerializableMapClone test value从输出可以看出系统是对象的实体内容是一致的,这就说明HashMap所做的是一种浅度复制,浅度复制在并发操作的时候容易出现数据一致性和并发迭代操作异常
方式二、putAll
public class SerializableDeepCopy {public static void main(String[] args) {HashMap<String, MySerializable> mySerializableMap = new HashMap<String, MySerializable>();MySerializable ms = new MySerializable();ms.setId(1);mySerializableMap.put("test", ms);HashMap<String, MySerializable> mySerializableMapClone = new HashMap<String, MySerializable>();mySerializableMapClone.putAll(mySerializableMap);if (mySerializableMap == mySerializableMapClone) {System.out.println("mySerializableMap == mySerializableMapClone");} else {System.out.println("mySerializableMap != mySerializableMapClone");}if (mySerializableMap.get("test") == mySerializableMapClone.get("test")) {System.out.println("mySerializableMap test value == mySerializableMapClone test value");} else {System.out.println("mySerializableMap test value != mySerializableMapClone test value");}}}输出结果如下:
mySerializableMap != mySerializableMapClonemySerializableMap test value == mySerializableMapClone test value结果仍然不理想,还是浅度复制
方式三、字节流复制
import java.io.ByteArrayInputStream;import java.io.ByteArrayOutputStream;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import java.io.Serializable;import java.util.HashMap;public class SerializableDeepCopy {public static void main(String[] args) {HashMap<String, MySerializable> mySerializableMap = new HashMap<String, MySerializable>();MySerializable ms = new MySerializable();ms.setId(1);mySerializableMap.put("test", ms);HashMap<String, MySerializable> mySerializableMapClone = clone(mySerializableMap);if (mySerializableMap == mySerializableMapClone) {System.out.println("mySerializableMap == mySerializableMapClone");} else {System.out.println("mySerializableMap != mySerializableMapClone");}if (mySerializableMap.get("test") == mySerializableMapClone.get("test")) {System.out.println("mySerializableMap test value == mySerializableMapClone test value");} else {System.out.println("mySerializableMap test value != mySerializableMapClone test value");}}@SuppressWarnings("unchecked")private static <T extends Serializable> T clone(T obj) {T clonedObj = null;try {ByteArrayOutputStream baos = new ByteArrayOutputStream();ObjectOutputStream oos = new ObjectOutputStream(baos);oos.writeObject(obj);oos.close();ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());ObjectInputStream ois = new ObjectInputStream(bais);clonedObj = (T) ois.readObject();ois.close();} catch (Exception e) {e.printStackTrace();}return clonedObj;}}输出结果如下:
mySerializableMap != mySerializableMapClonemySerializableMap test value != mySerializableMapClone test value这种方式就是深度复制。这样可以实现对象的分离和数据操作不会出异常。
0 0
- 关于对象的深度复制和浅度复制
- 一个关于深度复制和浅度复制的例子
- 关于浅度复制和深度复制的问题
- 关于对象的深度复制
- 类对象的深度复制,浅度复制
- Java的浅复制和深度复制
- c#浅度复制和深度复制
- 深度复制和浅度复制
- java深度复制和浅度复制
- Java深度复制和浅度复制
- c#:深度复制和浅度复制
- java深度复制和浅度复制
- 深度复制和浅度复制
- java深度复制和浅度复制
- 类的浅度复制和深度复制
- 【C#-深度复制和浅度复制的比较】
- 对象的深度复制
- 对象的深度复制
- 毕业生自传(南柯一梦)
- 数字通信原理与TCP/IP
- 引用作函数参数不需要初始化
- 查看gcc/g++预定义宏
- SSL工作原理
- 关于对象的深度复制和浅度复制
- Android studio设置背景图片
- java反射机制——getMethod/getField与getDeclaredMethod/getDeclaredField区别
- MethodInterceptor拦截器 加注解精准拦截method
- Java笔记(3)-设计模式、异常、内部类
- 获取系统CPU、内存和IO信息
- Ubuntu UI - 以root权限执行某个程序
- iOSCoreAnimation动画系列教程(一):CABasicAnimation
- NYOJ:最强DE 战斗力