2016-05-16 50 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); 
    } 
}