zoukankan      html  css  js  c++  java
  • java中将一个list的内容复制给另一个list之后,去新的list进行操作的时候,原来的list也会发生变化

    问题:java中将一个list的内容复制给另一个list之后,去新的list进行操作的时候,原来的list也会发生变化

    this.para.putAll(po.getPara());
    // fields是para下面的一个Map参数,此处本意是返回给客户端的fields元素中不包含aaa和bbb两个字段
    			List<Map<String, Object>> fields = (List<Map<String, Object>>)this.para.get("fields");
    			fields.forEach(item -> {
    				item.remove("aaa");
    				item.remove("bbb");
    			});

    以上代码出现的问题是,返回给界面的VO中确实没有了aaa和bbb两个字段,但不幸的是,对应数据库中的fields中也没有了这两个字段,这不是期望的。

    原因:map的putAll实现的是浅拷贝。

    解决方法:实现深拷贝,有三种方式

    1. 手动赋值,效率高,但代码过于啰嗦。
    2. 序列化与反序列化,使用SerializationUtils的clone(Object obj)方法,要求拷贝的对象实现了Serializable,Map不行,使用HashMap即可。
    3. 用fastjson从Object转成json,然后转回object,本质上是反射:
       private Object deepCopyByJson(Object obj) {
           String json = JSON.toJSONString(obj);
           return JSON.parseObject(json, Object.class);
       }

      具体使用哪种方法视具体场景而定,我解决这个问题用的是SerializationUtils,性能要求不高的情况下代码简洁也很重要。

    4. 解决方式

           List<EDto> sendOmsList = new ArrayList<EDto>();

           sendOmsList =(List<EDto>) SerializationUtils.clone((Serializable) sendList);

  • 相关阅读:
    用GDB调试pgAdmin3
    C/C++中的函数重载(overloading)
    C语言中的数据对齐
    一个颓废男人的自我救赎
    python--文件操作
    总结还是记录都不重要,重要的是我裂了
    两数之和
    OSI参考模型体系结构
    不完美,才美
    AB逻辑
  • 原文地址:https://www.cnblogs.com/lwh-12345/p/14272497.html
Copyright © 2011-2022 走看看