2

HashMap在 for 循环中使用时遇到问题。我做错什么了吗?我有什么需要做的改变吗?下面是代码及其输出。

代码:

public static void main(String[] args) {

    ArrayList<Double> arrBuckets = new ArrayList<Double>(3);

    HashMap<Integer, ArrayList<Double>> hashMap = new HashMap<Integer, ArrayList<Double>>();

    for(int i=1;i<5;i++)
    {
        arrBuckets.clear();
        arrBuckets.add(0,(1.0*i)) ;
        arrBuckets.add(1,(2.0*i)) ;
        arrBuckets.add(2,(3.0*i)) ;

        hashMap.put(i, arrBuckets);
    }

    System.out.println("hashMap : "+hashMap);
}

下面是输出:

hashMap : {1=[4.0, 8.0, 12.0], 2=[4.0, 8.0, 12.0], 3=[4.0, 8.0, 12.0], 4=[4.0, 8.0, 12.0]}

但输出应该是这样的:

hashMap : {1=[1.0, 2.0, 3.0], 2=[2.0, 4.0, 6.0], 3=[3.0, 6.0, 9.0], 4=[4.0, 8.0, 12.0]}
4

2 回答 2

5

当您将一个集合的对象放入另一个集合时,您传递的是对该对象的引用,而不是对象本身的副本。您只创建了一个列表,并且将此列表添加了四次。

我建议您将新的 ArrayList 移动到循环内,而不是每次都重用该列表。

你可以写

Map<Integer, List<Double>> map = new HashMap<Integer, List<Double>>();
for (int i = 1; i < 5; i++)
    map.put(i, Arrays.asList(1.0 * i, 2.0 * i, 3.0 * i));
System.out.println("map : " + map);

印刷

map : {1=[1.0, 2.0, 3.0], 2=[2.0, 4.0, 6.0], 3=[3.0, 6.0, 9.0], 4=[4.0, 8.0, 12.0]}
于 2013-02-03T09:41:38.357 回答
3

那是因为您总是使用相同的 arrayList :最后只有一个实例,ArrayList它保存最后一次迭代的值。

将循环更改为

for(int i=1;i<5;i++)
{
    ArrayList<Double> arrBuckets = new ArrayList<Double>(3);
    arrBuckets.add(0,(1.0*i)) ;
    arrBuckets.add(1,(2.0*i)) ;
    arrBuckets.add(2,(3.0*i)) ;

    hashMap.put(i, arrBuckets);
}
于 2013-02-03T09:41:34.653 回答