Java ArrayList的行为方式不同

时间:2016-02-04 03:31:38

标签: java arraylist

我正在运行一个代码,在每次迭代中填充哈希后,我将它添加到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}]

我很困惑为什么会这样。 有人可以解释一下吗?

2 个答案:

答案 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并将其添加到列表中。