在以下代码段中,我希望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变量的引用。然后,您对其进行修改(并通过这样做来修改列表中包含的引用),然后将相同的变量再次添加到列表中。因此,现在您对同一个对象有两个引用(如果愿意,也可以使用指针)。这就是为什么您得到这样的结果。