问题: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中也没有了这两个字段,这不是期望的。
解决方法:实现深拷贝,有三种方式:
- 手动赋值,效率高,但代码过于啰嗦。
- 序列化与反序列化,使用SerializationUtils的clone(Object obj)方法,要求拷贝的对象实现了Serializable,Map不行,使用HashMap即可。
- 用fastjson从Object转成json,然后转回object,本质上是反射:
private Object deepCopyByJson(Object obj) { String json = JSON.toJSONString(obj); return JSON.parseObject(json, Object.class); }
具体使用哪种方法视具体场景而定,我解决这个问题用的是SerializationUtils,性能要求不高的情况下代码简洁也很重要。
-
解决方式:
List<EDto> sendOmsList = new ArrayList<EDto>();
sendOmsList =(List<EDto>) SerializationUtils.clone((Serializable) sendList);