1

当我在多层循环中使用 ArrayList<Map<String,Object>> 时, ArrayList<Map<String,Object>> 很奇怪。

import java.util.*;

public class Main {
    public static void main(String [] args){
        ArrayList<Map<String, Object>>resList=new ArrayList<>();
        ArrayList<Map<String, Object>>resList1=new ArrayList<>();
        ArrayList<String>feeNameList=feeNameList();
        for(int i=0;i<1;i++){
            Map<String, Object>temp=new HashMap<>();
            for(int j=0;j<feeNameList.size();j++){
                temp.put("feeName",feeNameList.get(j));
                System.out.println(temp);
                resList.add(temp);
            }
        }
        System.out.println(resList);

        System.out.println("------------------------------------------------");
        for(int i=0;i<feeNameList.size();i++){
            Map<String, Object>temp=new HashMap<>();
            temp.put("feeName",feeNameList.get(i));
            System.out.println(temp);
            resList1.add(temp);
        }

        System.out.println(resList1);
    }

    public static ArrayList<String>feeNameList(){
        Set<String> costNameSets=new HashSet<>();
        costNameSets.add("CIC");
        costNameSets.add("VGM申报费VGM_COST");
        costNameSets.add("延补料费");
        ArrayList<String> costNameList=new ArrayList<>();
        costNameList.addAll(costNameSets);
        return costNameList;
    }
}

打印值为: 在此处输入图像描述

所以我想问的是,当我在多层循环中使用 ArrayList<Map<String, Object>> 时,为什么 ArrayList<Map<String, Object>> 的内容是一样的。

4

1 回答 1

1

这是因为在第一个循环中您继续使用相同的临时变量。您基本上在 resList 中保存了 3 次相同的临时参考。

如果在第二个示例中将 temp 放在 for 循环之外,您将得到完全相同的结果:

System.out.println("------------------------------------------------");
// We moved temp outside of the for loop and will get the same result as the first one
Map<String, Object>temp=new HashMap<>();
for(int i=0;i<feeNameList.size();i++){
    temp.put("feeName",feeNameList.get(i));
    System.out.println(temp);
    resList1.add(temp);
}

System.out.println(resList1);

如果将第一个示例中的 temp 对象移动到第二个 for 循环中,您将获得与第二个相同的结果。在两个 for 循环中添加一个System.out.println(resList);以更好地了解正在发生的事情。

于 2020-11-03T10:24:38.603 回答