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;
        }
    唯有热爱方能抵御岁月漫长。
  • 相关阅读:
    【Python】多态、协议和鸭子类型
    【Python】魔法方法之__call__,将对象当方法使用
    【Python】策略模式
    【Python】if 后怎么就可以跟对象?变量交换写法是语法糖吗?
    【Python 库】NumPy 超详细教程(3):ndarray 的内部机理及高级迭代
    【Python 库】NumPy 超详细教程(2):数据类型
    【Python 库】NumPy 超详细教程(1):NumPy 数组
    【杂谈】10 年三线小城 IT 开发的感悟
    【PostgreSQL】安装及中文显示
    【Python 库】轻量级 ORM 框架 peewee 用法详解之——增删改查
  • 原文地址:https://www.cnblogs.com/syq816/p/9969212.html
Copyright © 2011-2022 走看看