Java 在本例中,如何在hashamp中使用可变键?

Java 在本例中,如何在hashamp中使用可变键?,java,hashmap,immutability,Java,Hashmap,Immutability,现在,hm.get(sb)应该按照新的hashcode搜索bucket中的密钥。因此,它不应该得到任何对象下 这个桶应该是空的。那么为什么它会得到“第二”?,所以它会继承。因此,StringBuilders的内容不会影响哈希代码,即使您更改其内容,HashMap仍然能够找到StringBuilder,默认情况下,StringBuilder似乎没有将其内容用作其hashCode()的一部分,它只是继承了默认的hashCode()使用内存地址作为种子的from对象。因此,内存地址没有改变,因此密钥仍

现在,hm.get(sb)应该按照新的hashcode搜索bucket中的密钥。因此,它不应该得到任何对象下
这个桶应该是空的。那么为什么它会得到“第二”?

,所以它会继承。因此,
StringBuilder
s的内容不会影响哈希代码,即使您更改其内容,
HashMap
仍然能够找到
StringBuilder

,默认情况下,StringBuilder似乎没有将其内容用作其hashCode()的一部分,它只是继承了默认的hashCode()使用内存地址作为种子的from对象。因此,内存地址没有改变,因此密钥仍然有效

如果需要预期的行为,请重写hashCode方法以返回

  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"

另外,不要忘了重写equals()。

输出将是map的值,即您应该指定键类型
Map hm=new HashMap()
将按照您期望的方式工作。按原样,您正在键入
对象
,并且
StringBuilder
不会覆盖
hashCode
。默认情况下,我不知道StringBuilder使用其内容作为其hashCode()的一部分。询问还是回答?
@Override
public int hashCode() {
    return this.toString().hashCode();
}