使用put存储新的键值对时,现有键的Hashmap值会被覆盖。怎么预防呢?

时间:2013-05-13 12:52:37

标签: java hashmap

        HashMap<Integer, ArrayList<Integer>> map = new HashMap<Integer, ArrayList<Integer>>();
    ArrayList<Integer> al = new ArrayList<Integer>();//arraylist as value

    for (int j = 0; j < 3; j++) {
        for (int i = 0; i < 5; i++) {
            al.add(i + j);
        }
        System.out.println(al);
        System.out.println(j);//key value
        map.put(j, al);
        System.out.println(map);
        al.clear();
    }

为什么最后一个值arraylist会被所有键覆盖?如何避免过度写作?

2 个答案:

答案 0 :(得分:8)

你需要移动这一行:

ArrayList<Integer> al = new ArrayList<Integer>();//arraylist as value

在循环中。

您想为每个对象创建ArrayList,而不是仅为所有对象创建一个。{/ p>

for (int j = 0; j < 3; j++) {
    ArrayList<Integer> al = new ArrayList<Integer>();
    for (int i = 0; i < 5; i++) {
        al.add(i + j);
    }
    System.out.println(al);
    System.out.println(j);//key value
    map.put(j, al);
    System.out.println(map);
}

答案 1 :(得分:0)

只需清除它就无法重复使用旧的ArrayList,您需要每次都创建一个新的for (int j = 0; j < 3; j++) { ArrayList<Integer> al = new ArrayList<Integer>(); for (int i = 0; i < 5; i++) { al.add(i + j); } System.out.println(al); System.out.println(j);//key value map.put(j, al); System.out.println(map); }

HashMap

原因是ArrayList会将所有条目指向相同的{{1}},每次运行都会覆盖这些条目。