Java HashMap“;把「;for循环中的方法

Java HashMap“;把「;for循环中的方法,java,Java,在for循环中使用HashMap时,我遇到了一个问题。我做错什么了吗?我需要做些改变吗?下面是代码及其输出 代码: public static void main(String[] args) { ArrayList<Double> arrBuckets = new ArrayList<Double>(3); HashMap<Integer, ArrayList<Double>> hashMap = new HashMap<

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

代码:

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]}
但是输出应该是这样的:

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]}

这是因为您总是使用相同的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);
}

for(int i=1;i当您将一个集合的对象放置在另一个集合中时,您传递的是对该对象的引用,而不是对象本身的副本。您只创建了一个列表,并且添加了四次该列表

我建议您将新的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);

我也会将声明移动到循环中。效果很好。感谢Peter Lawrey和dystroy的快速响应。这样,如果你的
I
很大,可能会有太多新创建的对象。避免这种情况的更好方法?