Java中StringBuffer对象的哈希码是如何生成的?

3

我正在学习Java中的String,在学习过程中我了解到每个字符串都会生成一个哈希码。

我想知道在StringBuffer的情况下哈希码是如何生成的。


1
这样的问题,你应该先阅读文档,而不是在这里提问。 - Mihir Kekkar
2个回答

2
StringBuffer类没有覆盖从Object类继承的hashCode()方法,每当在StringBuffer实例上调用hashCode时,将使用Object类的hashCode实现。
这是因为StringBuffer是一个可变对象,与String不同,您可以轻松修改StringBuffer对象的状态。这使得它不适合在任何“哈希”数据结构中使用,如HashMap,因为它将不一致。 Object类的hashCode方法是一个本地方法,通常通过将对象的内部地址转换为整数作为哈希码值来实现,或者也可能不是,这取决于JVM的内部实现,但在不可变的String类中,hashCode被重写并使用String对象的内容来实现,以便在哈希数据结构中使用时保持一致。
只需运行片段即可进行简单的实验以检查此理论:
StringBuffer s1 = new StringBuffer("foo");
StringBuffer s2 = new StringBuffer("foo");

System.out.println(s1.hashCode() == s2.hashCode());
System.out.println(s1.toString().hashCode() == s2.toString().hashCode());

这将输出falsetrue。这是因为String实例实际上是使用对象的状态来计算哈希码的,所以对于s1.toString()s2.toString()都是相同的。"最初的回答"。

@JasmeetSingh 不用谢。 - Fullstack Guy
1
抱歉,但这个答案事实上是不正确的。在现代JVM中,机器地址通常不用于生成身份哈希码。请参见链接的问答。 - Stephen C
@StephenC 我使用了Java文档中的参考形式,但似乎没有涉及实现技术,感谢提供链接,我会更新答案。 - Fullstack Guy

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接