2010-08-11 47 views
4

我有一個Java的HashMap用來存放一些基本的字符串值:HashMap中的條目被完全不同的鍵覆蓋?

Map<String, String> map = new HashMap<String, String>(); 
map.put("Id", task.getStorageId()); 
map.put("Name", task.getName()); 
map.put("Description", task.getDescription()); 

下一個使用的Id項由Description進入overwitten,每次沒有失敗。我在調試器中看過它 - Id插入正常,Name插入正常,則當插入Descroption時,它會覆蓋Id條目。在應用程序的另一部分中使用完全相同的代碼和鍵可以毫無問題地工作。完全困惑。這裏發生了什麼?

編輯

也許我應該提到的(儘管它似乎並沒有相關的),這是發生在Android上,而不是在一個JVM。這可能是問題嗎?我也很難相信,但是代碼塊與提供的代碼片段一樣簡單。我將嘗試捆綁一個演示它併發布到某處的Android應用程序。

+1

是否實際代碼完全一樣(使用字符串文字的鍵)的一個在你的問題?或者你使用變量?有沒有機會讓你認爲包含「Description」的變量實際上包含「Id」? – sepp2k 2010-08-11 11:42:13

+0

這是逐字複製的。這根本不怎麼樣。 – MalcomTucker 2010-08-11 11:46:03

+4

@MalcolmTucker:目前,我很難相信這一點。我懷疑你的診斷有些問題,而不是地圖本身。如果您可以提供一個簡短但完整的程序來展示問題,那將會有很大幫助。 – 2010-08-11 11:52:14

回答

3

不是發生在我身上:

import java.util.Map; 
import java.util.HashMap; 

public class MapDemo 
{ 
    public static void main(String[] args) 
    { 
     Map<String, String> map = new HashMap<String, String>(); 
     map.put("Id", "task.getStorageId()"); 
     map.put("Name", "task.getName()"); 
     map.put("Description", "task.getDescription()"); 

     System.out.println("map: " + map); 
    } 
} 

下面是輸出:

com.intellij.rt.execution.application.AppMain MapDemo 
map: {Name=task.getName(), Description=task.getDescription(), Id=task.getStorageId()} 

Process finished with exit code 0 
4

這決不應該發生。 HashMap使用密鑰的hashCode()方法來索引映射的條目。 由於

"Id".hashCode() == "Description".hashCode() 

是假的(是的,我只是測試它的理智),該put(String, String)操作不會產生干擾。 做一些更多的檢查,並確保你的代碼與你上面發佈的代碼非常相似。

+4

即使hashCode是相等的(這肯定會發生,因爲有更多可能的字符串比ints),這不會有問題。如果兩個對象不是「等號」,它們將不會在哈希映射中相互覆蓋。 – sepp2k 2010-08-11 12:29:57

+0

非常真實。很好的補充。我總是忘記這該死的合同...... – f1sh 2010-08-11 12:53:45

3

也許你調試的代碼和你使用的源代碼不同步?也許你已經改變了你的源代碼,但是沒有正確編譯?也許你的類路徑中有一個包含舊版本軟件的jar?

5

很可能您沒有看到的條目存在,查看錶格的modCount,您應該看到正確的條目數。這意味着發生了散列衝突。基本上2個鍵被哈希到表中的同一個桶中。如果您查看具有原始密鑰的存儲桶,它會顯示下一個字段,這是指向您認爲已丟失的其他條目的指針。

0

我有相同的經驗和調試它看起來像一個條目被完全不同的條目覆蓋。當我試圖檢索它的值返回null。

但是,這是因爲,當檢索我使用了簡單的值作爲關鍵。使用確切格式時,值正確返回。

如:

map.put("A", "value1"); 
    map.put("B", "value2"); 
    map.put("C", "value3"); 

    map.get(a) --> null 
    map.get(A) --> value1