先看一段代码:
把 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?
参考 另一篇blog: java HashMap中出现重复的key, 求解释
原理其实比较 类似。
更改后的代码:
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等。