Java 为什么clear hashmap方法会清除数组列表中添加的映射

Java 为什么clear hashmap方法会清除数组列表中添加的映射,java,hashmap,Java,Hashmap,我正在尝试重用相同的HashMap,如下面的示例中所示,以填充列表。首先,我在地图中放置一些值,将地图添加到列表中,然后清除地图,以便再次放置新值,并在列表中添加第二组值,依此类推 但是,clear()方法似乎也会删除以前添加到列表中的值,如果我不使用clear()方法,以前添加到列表中的每个值集都会被新的值集覆盖,因此在这个特定的示例中,我将在列表中有4个相同的值集 我做错了什么 List<HashMap<String, String>>dataList = n

我正在尝试重用相同的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();
ListdataList=newarraylist();
HashMap=newHashMap();
地图放置(答案ID为“0”);
map.put(Answer.IMAGE,“color_icon_awesome”);
map.put(Answer.TITLE,firstOption);
添加(地图);
map.clear();
地图放置(答案ID,“1”);
map.put(Answer.IMAGE,“color_icon_awesome”);
map.put(Answer.TITLE,secondOption);
添加(地图);
map.clear();
地图放置(答案ID,“2”);
map.put(Answer.IMAGE,“color_icon_awesome”);
地图放置(答案、标题、第三部分);
添加(地图);
map.clear();
地图放置(答案ID,“3”);
map.put(Answer.IMAGE,“color_icon_awesome”);
地图。放置(答案。标题,四选项);
添加(地图);
map.clear();
dataList.add(map)
将在列表中放置对
map
的引用,因此它不是副本。然后执行
map.clear()
操作时,它也会删除列表中映射的内容,因为它是同一个对象。改为执行
dataList.add(map.clone())
,或者(最好)执行
map=newhashmap()之后

map.put(Answer.ID, "0");
map.put(Answer.IMAGE, "color_icon_awesome");
map.put(Answer.TITLE, firstOption);
dataList.add(map);
map = new HashMap<>();
这将使您的代码更漂亮、更可读

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));
List dataList=new ArrayList();
添加(新的AnswerObject(“0”,“颜色图标”,第一选项));
添加(新的AnswerObject(“1”,“颜色图标”,第二个选项));
添加(新的AnswerObject(“2”,“彩色图标”,第三个选项));
添加(新的AnswerObject(“3”,“颜色”图标“很棒”,四个选项));

但请忽略这一点;-)

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

您似乎正在创建单条目映射列表。这是一个非常不寻常的数据结构。你到底想干什么?也许有一种更合适(也更易于使用)的数据结构可以替代。您还应该考虑使用
EnumMap
使用对象的好主意。我确实有,但在所有的匆忙中,我只是遵循了一个老的例子,谢谢!
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));