zoukankan      html  css  js  c++  java
  • map对象拷贝问题

    map对象赋值:

    HashMap<String,Object> hm = new HashMap();
    HashMap<String,Object> hmCopy = new HashMap();
    hm.put("123", 123);
    System.out.println(hm.get("123"));
    hmCopy = hm;
    hmCopy.remove("123");
    System.out.println(hm.get("123"));
    输出结果:123    null
    这种直接赋值属于对象的引用变化,两个变量指向的是同一个对象
    //map拷贝putAll方法:
    HashMap<String,Object> hm = new HashMap();
    HashMap<String,Object> hmCopy = new HashMap();
    hm.put("123", 123);
    System.out.println(hm.get("123"));
    hmCopy.putAll(hm);
    hmCopy.remove("123");
    System.out.println(hm.get("123"));
    输出结果:123   123

    map对象深拷贝:

    List<Integer> list = new ArrayList<Integer>();
    list.add(100);
    list.add(200);
    
    HashMap<String,Object> map = new HashMap<String,Object>();
    map.put("basic", 100);//放基本类型数据
    map.put("list", list);//放对象
    
    HashMap<String,Object> mapNew = new HashMap<String,Object>();
    mapNew.putAll(map);
    
    System.out.println("----数据展示-----");
    System.out.println(map);
    System.out.println(mapNew);
    System.out.println("----更改基本类型数据-----");
    map.put("basic", 200);
    System.out.println(map);
    System.out.println(mapNew);
    System.out.println("----更改引用类型数据-----");
    list.add(300);
    System.out.println(map);
    System.out.println(mapNew);
    System.out.println("----使用序列化进行深拷贝-----");
    mapNew = CloneUtils.clone(map);
    list.add(400);
    System.out.println(map);
    System.out.println(mapNew);
    输出结果:
    ----数据展示-----
    {basic=100, list=[100, 200]}
    {basic=100, list=[100, 200]}
    ----更改基本类型数据-----
    {basic=200, list=[100, 200]}
    {basic=100, list=[100, 200]}
    ----更改引用类型数据-----
    {basic=200, list=[100, 200, 300]}
    {basic=100, list=[100, 200, 300]}
    ----使用序列化进行深拷贝-----
    {basic=200, list=[100, 200, 300, 400]}
    {list=[100, 200, 300], basic=200}
    最上面的两条是原始数据,使用了putAll方法拷贝了一个新的mapNew对象,
    中间两条,是修改map对象的基本数据类型的时候,并没有影响到mapNew对象。
    但是看倒数第二组,更改引用数据类型的时候,发现mapNew的值也变化了,所以putAll并没有对map产生深拷贝。
    最后面是使用序列化的方式,发现,更改引用类型的数据的时候,mapNew对象并没有发生变化,所以产生了深拷贝。
    上述的工具类,可以实现对象的深拷贝,不仅限于HashMap,前提是实现了Serlizeable接口。
     
    //附克隆方法:
    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;
    }
  • 相关阅读:
    JAVA 图形验证码在CentOS环境无法正常显示
    tomcat 测试环境配置在线浏览下载日志文件
    Jenkins+maven+SVN+Tomcat一键自动打包war部署到应用服务器
    mysql5 存储过程和触发器示例
    easyui datagrid 右冻结、右侧冻结、冻结右边列、冻结右侧列
    myeclipse 2017+ 中的FreeMaker 渲染出错 Encountered "-", but was expecting one of: "=" "..." "," ")"&#160;">" ---- FTL stack trace ("~" means nesting-related):
    自动化运维工具 ansible 安装应用
    CentOS7 + JDK1.8 + Tomcat8.5 实现HTTP/2.0、 http2 服务
    flume-1.9.0 与 hadoop-3.3.0 HDFS 对接部署
    hive-3.1.2 整合进 hadoop-3.3.0 + hbase-2.2.4
  • 原文地址:https://www.cnblogs.com/leskang/p/7169233.html
Copyright © 2011-2022 走看看