在以下代码段中,我希望list为地图的集合。我没有每次都创建一个新的HashMap,而是尝试清除并重用以前的变量。

    List<Map> list = new ArrayList<>();
    Map<String,String> aMap = new HashMap<>();
    aMap.put("fou","bar");
    list.add(aMap);
    aMap.clear();
    aMap.put("big", "bang");
    list.add(aMap);
    System.out.println(list.toString());


我很惊讶列表内的值受到变量aMap的“清除”操作的影响,输出如下:

   [{big=bang}, {big=bang}]


这里发生了什么 ?

最佳答案

这是一个棘手的问题:)基本上,列表包含对对象的引用,而不是对象的副本。因此,当您将aMap添加到列表时,您将添加对该Map变量的引用。然后,您对其进行修改(并通过这样做来修改列表中包含的引用),然后将相同的变量再次添加到列表中。因此,现在您对同一个对象有两个引用(如果愿意,也可以使用指针)。这就是为什么您得到这样的结果。

10-08 06:59