1. 程式人生 > >java中 兩個List copy 遇到的問題

java中 兩個List copy 遇到的問題

先看一段程式碼:

   把 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等。