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;
    }
唯有热爱方能抵御岁月漫长。
原文地址:https://www.cnblogs.com/syq816/p/9969212.html