2016-05-16 72 views
0

我有一个Map对象,我使用整数作为关键字,列表作为相应的值。这是我的代码。HashMap值不更新

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);  

    } 
} 

如果我不包括明确的说法则没有更新的第二个列表,和我在打印语句二月1日至10日的块。如果我添加了清除命令,则只在两个块中打印10-15。

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

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

+0

列表是对象。你只创建一个'dubList'列表。无论你将它添加到'dataDouble'多少次,它都将是同一个对象,同一个列表。 –

+0

因此,地图中的值并未实际设置,而只是指向对象本身? –

+0

@PeytonC。正确的,因为它指向的是对象的引用,所以当你将它添加到列表中时,你只是将引用添加到名为'dubList'的ArrayList中,该对象中有0-15个元素,因为你从未初始化过一个新的'ArrayList '。 – Orin

回答

2

你是不是把下的不同密钥的不同ArrayListHashMap。您将相同ArrayList每个下。这意味着对它所做的任何改变都会反映在所有这些改变中(因为它们都是同一个对象)。

如果你想有多个不同的List s,你需要创建一个新的new ArrayList<>()。因此,请将cleardubList = new ArrayList<>()的行代替,并且它会正确地为您提供新的实例。

2

您使用的是相同的对象为所有要添加到地图中的条目。

添加后,更改List参考指向。

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

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

您正在使用对名为dubList的相同ArrayList的引用,并将该引用添加到您的映射两次。你需要有两个单独的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); 
    } 
}