将变量添加到集合后删除变量

时间:2018-04-11 13:49:04

标签: java collections reference

在以下代码段中,我希望 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}]

这里发生了什么?

2 个答案:

答案 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());