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);


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM