我正在运行一个代码,在每次迭代中填充哈希后,我将它添加到arraylist中,因此所有迭代中的值都存储在arraylist中。 我的代码在 -
之下public class FirstRepeated {
public static void main(String[] args) {
// TODO Auto-generated method stub
HashMap<String, Integer> map = new HashMap<String, Integer>();
List<HashMap<String, Integer>> list = new ArrayList<HashMap<String, Integer>>();
for(int i=0;i<5;i++) {
map.put("test", i);
list.add(map);
}
System.out.println(map);
System.out.println(list);
}
}
正在打印的输出是
{test=4}
[{test=4}, {test=4}, {test=4}, {test=4}, {test=4}]
但是,AFAIK预期的输出是
{test=4}
[{test=0}, {test=1}, {test=2}, {test=3}, {test=4}]
任何人都可以告诉我这是什么错误吗?
我尝试调试它,但在执行list.add(map);
之前,列表中的值正在更新。
例如: -
Iteration 2 (i=1)
Value in list after iteration 1 (i=0) is
[{test=0}]
But when the execution reaches map.put("test", i);
The value in list is being updated to [{test=1}]
and after the execution of the line list.add(map)
value is being updated in list to [{test=1},{test=1}]
我很困惑为什么会这样。 有人可以解释一下吗?
答案 0 :(得分:3)
您一遍又一遍地将相同地图重新添加到列表中。你需要在循环内部创建一个新的。
List<Map<String, Integer>> list = new ArrayList<Map<String, Integer>>();
for(int i=0;i<5;i++) {
Map<String, Integer> map = new HashMap<String, Integer>();
map.put("test", i);
list.add(map);
}
答案 1 :(得分:0)
在Map中,键是唯一的,如果您尝试添加具有相同键的元素,则前一个键将被覆盖。在循环中创建一个新的Map并将其添加到列表中。