java中 兩個List copy 遇到的問題
阿新 • • 發佈:2019-01-25
先看一段程式碼:
把 List taskDataRelInfos 中的 內容 拷貝到 List taskDataRels 中,二者 欄位型別 基本一樣。
List<TaskDataRelInfo> taskDataRelInfos = taskDataRelsInfo.getTaskDataRelInfosList(); List<TaskDataRel> taskDataRels = new ArrayList<TaskDataRel>(); TaskDataRel taskDataRel = new TaskDataRel(); Data data = new Data(); Long taskId = 0L; for (TaskDataRelInfo taskDataRelInfo : taskDataRelInfos) { taskId = taskDataRelInfo.getTaskId(); taskDataRel.setTaskId(taskId); taskDataRel.setRelType(taskDataRelInfo.getRelType()); data.setDataName(taskDataRelInfo.getDataInfo().getDataName()); data.setDataType(taskDataRelInfo.getDataInfo().getDataType()); taskDataRel.setData(data); taskDataRels.add(taskDataRel); }
上面這段程式碼 存在bug。每次執行後,新得到的 list taskDataRels 中的各項 都是一摸一樣的,即都和 原始list中的 最後一項 一樣。
但原始List taskDataRelInfos 中的各項內容 其實不一樣。
why?
原理其實比較 類似。
更改後的程式碼:
List<TaskDataRelInfo> taskDataRelInfos = taskDataRelsInfo.getTaskDataRelInfosList(); List<TaskDataRel> taskDataRels = new ArrayList<TaskDataRel>(); Long taskId = 0L; for (TaskDataRelInfo taskDataRelInfo : taskDataRelInfos) { TaskDataRel taskDataRel = new TaskDataRel(); Data data = new Data(); // 起初把這兩行yu taskId = taskDataRelInfo.getTaskId(); taskDataRel.setTaskId(taskId); taskDataRel.setRelType(taskDataRelInfo.getRelType()); data.setDataName(taskDataRelInfo.getDataInfo().getDataName()); data.setDataType(taskDataRelInfo.getDataInfo().getDataType()); taskDataRel.setData(data); taskDataRels.add(taskDataRel); }
這樣更改,則符合預期。
其實 copy 兩個List 還有更簡單的方法,呼叫一些 類庫,譬如guava等。