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。那为什么它会变得“第二”呢?
答案 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()。