2014-03-03 51 views
4
HashMap hm = new HashMap(); 
    StringBuilder sb = new StringBuilder("test"); 
    hm.put(sb, "second"); 
    // above code gets hacode for sb and places it corresponding bucket 

    sb.append("123");// with appending of "123", sb hascode will change 

    System.out.println("element is is" + hm.get(sb));// print "second" 

現在hm.get(SB)應搜索在桶的關鍵按新的哈希碼。所以它不應該得到 桶中的任何對象,並應該爲空。那麼爲什麼它獲得「第二」?在這個例子中,如何在hashamp中使用Mutable鍵?

+0

輸出將地圖即第二 – Kick

+0

您應該指定密鑰類型的值; 'Map hm = new HashMap ()'會按照您期望的方式工作。正如你所說,你在鍵入'Object'而'StringBuilder'不會重載'hashCode'。 –

回答

1

默認情況下,它看起來像StringBuilder的不使用它的內容作爲其的hashCode()的一部分,它只是繼承對象的默認的hashCode(),它使用的內存地址作爲它的種子。所以內存地址沒有改變,因此密鑰仍然有效。

如果你想你所期望的行爲,覆蓋hashCode方法返回

@Override 
public int hashCode() { 
    return this.toString().hashCode(); 
} 

,不要忘記重寫equals()方法爲好。

+0

默認情況下,我不知道StringBuilder的使用其內容作爲其的hashCode(的一部分)。問或回答? – Kick

相關問題