Map的深拷贝、浅拷贝,开发时需要注意。
package test;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class TestMap {
public static void main(String[] args) {
HashMap map = new HashMap();
List list = new ArrayList();
list.add(100);
list.add(200);
map.put("basicType", 100);
map.put("list", list);
// 数据展示
System.out.println("------数据展示--------");
System.out.println("map:n" + map);
// 此处想达到copyMap1数据为map中的数据不变
System.out.println("浅复制。。。。。");
Map copyMap1 = map;// 浅复制,只是引用给了copyMap,map中数据改变,copyMap数据也会改变
map.put("basicType", 200);
System.out.println("map:n" + map);
System.out.println("copyMap1:n" + copyMap1);
// 此处想达到copyMap2数据为map中的数据不变
System.out.println("假深复制-----改变引用类型和基本类型");
Map copyMap2 = new HashMap();
copyMap2.putAll(map);// 假深复制,只对基本类型可用,当list中内容发生改变时,copyMap2中数据依然会变
map.put("basicType", 300);
list.add(300);
System.out.println("map:n" + map);
System.out.println("copyMap2:n" + copyMap2);
// 此处想达到copyMap3数据为map中的数据不变
System.out.println("深复制---使用序列化进行深拷贝");
HashMap copyMap3 = new HashMap();
copyMap3 = clone(map);
map.put("basicType", 400);
list.add(400);
System.out.println("map:n" + map);
System.out.println("copyMap3:n" + copyMap3);
}
public static 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;
}
}



