Java HashMap“;把「;for循环中的方法
在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<
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
很大,可能会有太多新创建的对象。避免这种情况的更好方法?