例如以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所做的是一种浅度复制,浅度复制在并发操作的时候容易出现数据一致性和并发迭代操作异常
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这种方式就是深度复制。这样可以实现对象的分离和数据操作不会出异常。