HashMap值在循环中重新初始化

时间:2014-07-20 12:56:51

标签: java collections arraylist hashmap

这是我的代码。

public class Test {
    public static void main(String[] args) {                
        ArrayList<Integer> temp = new ArrayList<Integer>();
        HashMap<Integer, ArrayList<Integer>> map = new HashMap<Integer, ArrayList<Integer>>();
        int serialno = 0;

        for (int i = 1000; i < 1004; i++) {
            temp.clear();

            temp.add(i);
            temp.add((i+1000));

            map.put(serialno++, temp);
        }
        System.out.println(map);
    }
}

我希望输出为

{0=[1000, 2000], 1=[1001, 2001], 2=[1002, 2002], 3=[1003, 2003]}

但我将输出视为

{0=[1003, 2003], 1=[1003, 2003], 2=[1003, 2003], 3=[1003, 2003]}

这里发生了什么。我哪里出错了??

2 个答案:

答案 0 :(得分:2)

清除ArrayList temp时,您所做的只是删除它的值。但是,当您将ArrayList放入地图时,实际上是将ArrayList的对象引用放入地图中,而是一个带有新值的新列表。所以在你的地图中是相同ArrayList的四倍(因此是相同值的四倍)。

 HashMap<Integer, ArrayList<Integer>> map = new HashMap<Integer, ArrayList<Integer>>();
 int serialno = 0;

 for (int i = 1000; i < 1004; i++) {
      ArrayList<Integer> temp = new ArrayList<Integer>();
      temp.add(i);
      temp.add((i + 1000));
      System.out.println(i + 1000);

      map.put(serialno++, temp);
 }
 System.out.println(map);

在每个循环中创建一个新List时,实际上会在地图中放置不同的ArrayLists(带有不同的引用)。

答案 1 :(得分:1)

您只创建了ArrayList的一个对象,并将其多次加到HashMap中,这样您就可以在HashMap中对同一个对象进行多次引用,但是您需要多个ArrayList { {1}}对象,因此您必须在循环中创建它们。

public class Test {
    public static void main(String[] args) {
        HashMap<Integer, ArrayList<Integer>> map = new HashMap<Integer, ArrayList<Integer>>();
        int serialno = 0;

        for (int i = 1000; i < 1004; i++) {
            ArrayList<Integer> temp = new ArrayList<Integer>();

            temp.add(i);
            temp.add((i+1000));

            map.put(serialno++, temp);
        }

        System.out.println(map);
    }
}