HashMap值不更新

时间:2016-05-16 20:23:01

标签: java hashmap

我有一个Map对象,其中我使用整数作为键,并列出相应的值。这是我的代码。

Map<Integer, List<Double>> dataDouble = new HashMap<Integer, List<Double>>();
List<Double> dubList = new ArrayList<Double>();
for(double i = 0; i < 10; i++)
    dubList.add(i);

dataDouble.put(1, dubList);
//dubList.clear(); 

for(int i = 10; i < 16; i++)
    dubList.add(i);

dataDouble.put(2, dubList);

Set<Integer> keyset = dataDouble.keySet();

for(Integer key : keyset) {
    System.out.println("\t\tKEY: " + key);
    List<Double> finList = dataDouble.get(key);
    for(double value : finList)
        System.out.println("VALUE: " + value);    

    }   
}

如果我不包含clear语句,则第二个列表不会更新,并且我在print语句中得到2个1到10的块。如果我添加clear命令,则在两个块中仅打印10-15。

我的问题是,为什么clear命令清除数据已添加到Map中,为什么在列表中添加新数据并将其放在Map上实际上不会更改值?

编辑:我知道我使用的是double而不是int,在我的实际项目中我处理的是双值

3 个答案:

答案 0 :(得分:2)

您正在为地图中添加的所有条目使用相同的对象。

添加后,更改引用所指向的List

dataDouble.put(1, dubList);
dubList = new ArrayList<>();   <--- HERE

for(int i = 10; i < 16; i++)
    dubList.add(i);

答案 1 :(得分:2)

您没有在ArrayList的不同键下添加不同的HashMap。您将 相同的 ArrayList放在每个下面。这意味着对它进行的任何更改都将反映在所有这些中(因为它们都是相同的对象)。

如果您想拥有多个不同的List,则需要使用new ArrayList<>()创建一个新的clear。所以用[{1}}替换dubList = new ArrayList<>()它所在的行,它会正确地为您提供一个新实例。

答案 2 :(得分:1)

您正在使用对同名ArrayList命名dubList的引用,并将该引用添加到您的地图两次。您需要有两个单独的ArrayList声明。

Map<Integer, List<Double>> dataDouble = new HashMap<Integer, List<Double>>();
List<Double> dubList = new ArrayList<Double>();
for(double i = 0; i < 10; i++)
   dubList.add(i);

dataDouble.put(1, dubList);

//add a new ArrayList
List<Double> dubList2 = new ArrayList<Double>();

for(int i = 10; i < 16; i++)
   dubList2.add(i);

dataDouble.put(2, dubList2);

Set<Integer> keyset = dataDouble.keySet();

for(Integer key : keyset) {
   System.out.println("\t\tKEY: " + key);
   List<Double> finList = dataDouble.get(key);
   for(double value : finList)
      System.out.println("VALUE: " + value);
   }
}