文章目录
- 一、浅复制 (=)
- 二、伪深复制 (new HashMap)
- 三、解密伪深复制 (new HashMap)
- 四、真正的深复制
- 五、更高性能的深复制
- 六、深复制性能对比
- 七、推荐使用 Cloner.standard().deepClone
public static void testDeepClone1(){
Map map1 = new HashMap<>();
map1.put(1,1);
map1.put(2,2);
Map map2 = map1;
System.out.println("map1 == map2 :" + (map1 == map2));
map2.remove(1);
System.out.println("map1 :" + map1);
System.out.println("map2 :" + map2);
}
map1 == map2 :true
map1 :{2=2}
map2 :{2=2}
public static void testDeepClone2(){
Map map1 = new HashMap<>();
map1.put(1,1);
map1.put(2,2);
Map map2 = new HashMap<>(map1);
System.out.println("map1 == map2 :" + (map1 == map2));
map2.remove(1);
System.out.println("map1 :" + map1);
System.out.println("map2 :" + map2);
}
map1 == map2 :false
map1 :{1=1, 2=2}
map2 :{2=2}
注意:value是一个集合set,也就是一个对象
public static void testDeepClone3(){
Map> map1 = new HashMap<>();
map1.put(1, Sets.newHashSet(11,12,13));
map1.put(2, Sets.newHashSet(21,22,23));
Map> map2 = new HashMap<>(map1);
System.out.println("map1 == map2 :" + (map1 == map2));
System.out.println("map1.get(1) == map2.get(1) :" + (map1.get(1) == map2.get(1)));
// remove掉集合里面的一个元素
map2.get(1).remove(11);
System.out.println("map1 :" + map1);
System.out.println("map2 :" + map2);
}
map1 == map2 :false
map1.get(1) == map2.get(1) :true
map1 :{1=[12, 13], 2=[21, 22, 23]}
map2 :{1=[12, 13], 2=[21, 22, 23]}
@SuppressWarnings("unchecked")
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;
}
public static void testDeepClone4(){
HashMap> map1 = new HashMap<>();
map1.put(1, Sets.newHashSet(11,12,13));
map1.put(2, Sets.newHashSet(21,22,23));
Map> map2 = clone(map1);
System.out.println("map1 == map2 :" + (map1 == map2));
System.out.println("map1.get(1) == map2.get(1) :" + (map1.get(1) == map2.get(1)));
// remove掉集合里面的一个元素
map2.get(1).remove(11);
System.out.println("map1 :" + map1);
System.out.println("map2 :" + map2);
}
map1 == map2 :false
map1.get(1) == map2.get(1) :false
map1 :{1=[12, 13, 11], 2=[21, 22, 23]}
map2 :{1=[12, 13], 2=[21, 22, 23]}
uk.com.robust-it
cloning
1.9.3
public static void testDeepClone5(){
HashMap> map1 = new HashMap<>();
map1.put(1, Sets.newHashSet(11,12,13));
map1.put(2, Sets.newHashSet(21,22,23));
Map> map2 = Cloner.standard().deepClone(map1);
System.out.println("map1 == map2 :" + (map1 == map2));
System.out.println("map1.get(1) == map2.get(1) :" + (map1.get(1) == map2.get(1)));
// remove掉集合里面的一个元素
map2.get(1).remove(11);
System.out.println("map1 :" + map1);
System.out.println("map2 :" + map2);
}
map1 == map2 :false
map1.get(1) == map2.get(1) :false
map1 :{1=[12, 13, 11], 2=[21, 22, 23]}
map2 :{1=[12, 13], 2=[21, 22, 23]}
public static void testDeepClonePerformance(){
List list = Lists.newArrayList();
for (int i = 0; i < 10000; i++) {
list.add(i);
}
HashMap> mapSource = Maps.newHashMap();
for (int i = 0; i < 10000; i++) {
mapSource.put(i,list);
}
long begin = System.currentTimeMillis();
Cloner.standard().deepClone(mapSource);
System.out.println("Cloner.standard().deepClone it costs : " + (System.currentTimeMillis() - begin) + "ms");
long begin2 = System.currentTimeMillis();
clone(mapSource);
System.out.println("io deepClone it costs : " + (System.currentTimeMillis() - begin2) + "ms");
}
Cloner.standard().deepClone it costs : 39ms
io deepClone it costs : 121ms