Map的复制
Map的复制不可以直接使用=赋值
Map<String,Object> map1 = new HashMap<String,Object>(); Map<String,Object> copy = new HashMap<String,Object>(); map1.put("木了洋", "李振洋"); System.out.println(map1.get("木了洋")); copy = map1; copy.remove("木了洋"); System.out.println(map1.get("木了洋"));
输出结果为:李振洋 null
这种的复制只是对象引用的变化,两个变量其实指的是同一个对象,在内存中占用同一块内存。所以在copy移除时map1的值也移除了。
Map的putall方法可以实现map的浅复制,当值都是基本数据类型时,map的putall方法可以实现map的深复制。但是如果值是引用类型的时候就出现问题了。
Map<String,Object> map1 = new HashMap<String,Object>(); Map<String,Object> copy = new HashMap<String,Object>(); map1.put("木了洋", "李振洋"); System.out.println(map1.get("木了洋")); copy.putAll(map1); copy.remove("木了洋"); System.out.println(map1.get("木了洋"));
输出结果为:李振洋 李振洋
Map<String,Object> map1 = new HashMap<String,Object>(); Map<String,Object> copy = new HashMap<String,Object>(); Map<String,Object> subMap = new HashMap<String,Object>(); subMap.put("prinkey", "yue"); subMap.put("kwin", "yang"); subMap.put("katto", "fan"); subMap.put("didi", "chao"); map1.put("fan", "55667788"); map1.put("bc221", subMap); copy.putAll(map1); System.out.println("initialization data:----------------"); System.out.println(map1); System.out.println(copy); subMap.put("mk", "mianku"); map1.put("fan", "nzdm"); System.out.println("after update data:----------------"); System.out.println(map1); System.out.println(copy);
输出结果为:
可以看到的时当map里面的当基本数据类型发生变化时,copy并没有受到影响。但是引用数据类型发生改变时,copy的值也跟随变化了!
所以并没有实现真正的复制。
实现map的深复制,需要用到对象的克隆方法,用流的方式进行复制操作。但是不仅限于map的复制,只要实现了 Serializable接口的类都可以用如下方法进行复制操作。比如说你自己定义的类,实现 Serializable接口也可以这个方法进行深复制了。
public static <T extends Serializable> T clone(T obj) { T cloneObj = null; try { // 写入字节流 ByteArrayOutputStream out = new ByteArrayOutputStream(); ObjectOutputStream obs = new ObjectOutputStream(out); obs.writeObject(obj); obs.close(); // 分配内存,写入原始对象,生成新对象 ByteArrayInputStream ios = new ByteArrayInputStream(out.toByteArray()); ObjectInputStream ois = new ObjectInputStream(ios); // 返回生成的新对象 cloneObj = (T) ois.readObject(); ois.close(); } catch (Exception e) { e.printStackTrace(); } return cloneObj; }
唯有热爱方能抵御岁月漫长。