如何在这个例子中使用hashmap中的Mutable键?

时间:2014-03-03 18:19:25

标签: java hashmap immutability

  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)应该根据新的哈希码搜索存储桶中的密钥。所以它不应该得到任何对象       该桶应该为null。那为什么它会变得“第二”呢?

2 个答案:

答案 0 :(得分:7)

The StringBuilder class does not override hashCode,因此它继承了the hashCode method from Object。因此,StringBuilder'的内容不会影响哈希码,即使您更改其内容,HashMap仍然可以找到StringBuilder

答案 1 :(得分:1)

默认情况下,看起来StringBuilder不会将其内容用作其hashCode()的一部分,它只是从Object继承默认的hashCode(),它使用内存地址作为其种子。因此内存地址没有改变,因此密钥仍然有效。

如果您想要预期的行为,请覆盖hashCode方法以返回

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

并且不要忘记重写equals()。