为什么清除hashmap方法清除数组列表中添加的map

时间:2016-02-22 16:45:40

标签: java hashmap

我尝试重复使用相同的HashMap,如下例所示填充列表。首先,我在地图中添加了一些值,将地图添加到列表中,然后清除地图,以便再次添加新值并在列表中添加第二组值,等等......

但是,似乎clear()方法还删除了先前在列表中添加的值,如果我不使用clear()方法,则先前在列表中添加的每组值都会被新的值集覆盖,因此在这个特定的例子中,我将在列表中有4个相同的值集。

我做错了什么?

    List<HashMap<String, String>>dataList = new ArrayList<HashMap<String, String>>();
    HashMap<String, String> map = new HashMap<String, String>();

    map.put(Answer.ID, "0");
    map.put(Answer.IMAGE, "color_icon_awesome");
    map.put(Answer.TITLE, firstOption);
    dataList.add(map);
    map.clear();             

    map.put(Answer.ID, "1");
    map.put(Answer.IMAGE, "color_icon_awesome");
    map.put(Answer.TITLE, secondOption);
    dataList.add(map);
    map.clear();

    map.put(Answer.ID, "2");
    map.put(Answer.IMAGE, "color_icon_awesome");
    map.put(Answer.TITLE, thirdOption);
    dataList.add(map);
    map.clear();

    map.put(Answer.ID, "3");
    map.put(Answer.IMAGE, "color_icon_awesome");
    map.put(Answer.TITLE, fourthOption);
    dataList.add(map);
    map.clear();

2 个答案:

答案 0 :(得分:11)

dataList.add(map)会在列表中引用map,因此它不是副本。然后,当您再执行map.clear()时,它也会删除列表中地图的内容,因为它是完全相同的对象。之后做dataList.add(map.clone())或(最好)做map = new HashMap<>();

map.put(Answer.ID, "0");
map.put(Answer.IMAGE, "color_icon_awesome");
map.put(Answer.TITLE, firstOption);
dataList.add(map);
map = new HashMap<>();

旁注:您的代码看起来像是可以使用对象而不是地图:

class AnswerObject {

  private String id;
  private String image;
  private String title;

  public AnswerObject(String id, String image, String title) {
      this.id = id;
      this.image = image;
      this.title = title;
  }

  // some getters and setters and some other usefull code

}

这应该使您的代码更好,更易读

List<AnswerObject> dataList = new ArrayList<>();
dataList.add(new AnswerObject("0", "color_icon_awesome", firstOption));
dataList.add(new AnswerObject("1", "color_icon_awesome", secondOption));
dataList.add(new AnswerObject("2", "color_icon_awesome", thirdOption));
dataList.add(new AnswerObject("3", "color_icon_awesome", fourthOption));

但可以随意忽略; - )

答案 1 :(得分:1)

您要将相同的地图添加到列表中。您是否想要获得来自地图或地图列表的字符串列表?如果您想要一个地图列表,那么每次都需要创建一个新地图。将地图放入列表并修改地图内容后,您将修改添加到列表中的相同地图。只需在添加方法中更改代码,而不是dataList.add(map);执行dataList.add(new HashMap(map));这将解决您的问题