关于对象的深度复制和浅度复制

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 != mySerializableMapClone
mySerializableMap 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 != mySerializableMapClone
mySerializableMap 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 != mySerializableMapClone
mySerializableMap test value != mySerializableMapClone test value
这种方式就是深度复制。这样可以实现对象的分离和数据操作不会出异常。




你可能感兴趣的:(关于对象的深度复制和浅度复制)