zoukankan      html  css  js  c++  java
  • 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;
        }
    唯有热爱方能抵御岁月漫长。
  • 相关阅读:
    Scrapy框架
    描述符类
    完整的blog设计过程
    钉钉机器人设置步骤
    homework登录和支付mock两个接口
    jsonpath的用法和nnlog的使用
    mp4格式文件转码后处理(qt-faststart).md
    html5视音频标签参考.md
    ffmpeg文档43-开发者
    ffmpeg文档42-参考/看
  • 原文地址:https://www.cnblogs.com/syq816/p/9969212.html
Copyright © 2011-2022 走看看