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