2012-07-09 27 views
1

這裏是我的代碼:Java中的HashMap不起作用?

double getRevenue(KeywordGroupKey key) { 
    Double r = revenueMap.get(key); 
    System.out.println(key + "\t" + key.hashCode()); 
    for (KeywordGroupKey other : revenueMap.keySet()) { 
     System.out.println(other.toString() + "\t" + other.hashCode()); 
     if(other.equals(key)) 
      System.out.println("equals here..."); 
    } 
    if(r == null) 
     r = 0.0; 
    return r; 
} 

這裏是輸出:

優惠打折,優惠券|"優惠券" 955095524 
brand+點評團購|大衆點評 726983298 
brand-品牌詞相關|團購網站大全 -713384514 
brand-品牌詞|點評網 2029153675 
brand+點評團購|大衆點評網 261410621 
優惠打折,優惠券|"優惠券" 955095524 
equals here... 

所以就是這麼奇怪,該方法返回的值是空的,爲什麼劑量出現這種情況?由於revenueMap中有一個關鍵字具有相同的哈希碼並且與參數關鍵字相等。 下面是revenueMap的當前狀態和關鍵:

{brand+點評團購|大衆點評=28.0, brand-品牌詞相關|團購網站大全=49.9, brand-品牌詞|點評網=21.0, brand+點評團購|大衆點評網=167.0, 優惠打折,優惠券|"優惠券"=9.9} 
優惠打折,優惠券|"優惠券" 
+0

能否請您發佈的代碼 – 2012-07-09 07:01:33

+0

的重複性單位有沒有簡單的方法來發布,因爲我添加鍵值對到地圖解析一個大的日誌文件時並且代碼太多。 – 2012-07-09 07:05:09

+2

也許這個鍵(存在)的值是'null'?你可以做'revenueMap.put(「優惠券」,null)' – Thilo 2012-07-09 07:06:15

回答

7

我的猜測是,KeywordGroupKey是可變的,它被用來作爲哈希表的鍵後,問題的關鍵已被修改。

如果是這樣的話,那麼關鍵就是在HashMap錯誤的「桶」和get()方法(或containsKey()法)將永遠不會找到它(但遍歷密鑰和/或項目發現!)。

例如,假設您的班級中有一個屬性foo,並且該屬性與您的hashCode()equals()方法有關。下面的代碼將「打破」的HashMap

KeywordGroupKey key = ... 
revenueMap.put(key, someValue); 
key.setFoo("differentValue"); 
Double result = revenueMap.get(key); // will return nothing! 
Double result = revenueMap.get(originalValueOfKey); // will *also* return nothing! 
+0

如果兩個對象相等,他們如何得到不同的哈希碼?我在上面的問題中得到了相同的哈希碼:955095524。 @Joachim Sauer – 2012-07-09 07:37:38

+2

我的意思是說你插入到'HashMap'中的關鍵字在**之後有**改變* **,你將它用作地圖中的關鍵字,這會「破壞」地圖。 – 2012-07-09 07:44:30