在以下代码段中,我希望 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上的&#34; clear&#34; 操作的影响,输出如下:
[{big=bang}, {big=bang}]
这里发生了什么?
答案 0 :(得分:3)
这是一个棘手的问题:)基本上该列表包含对象的引用,而不是对象的副本。因此,当您向列表添加Map时,您将添加对该Map变量的引用。然后你修改它(通过这样做你修改你在列表中保存的引用),然后再次将相同的变量添加到列表中。所以现在你有两个相同对象的引用(或者你喜欢的指针)。这就是你得到这样结果的原因。
答案 1 :(得分:0)
由于您已经在列表的开头添加了一个Map,因此aMap会继续添加到列表中,而是重写代码,如下所示:
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);&gt; - 评论,因为你已经开始将地图值添加到数组列表。
System.out.println(list.toString());