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

How hash code is generated for StringBuffer object in java?

我正在 java 学习 String 并且在学习的过程中我了解到哈希码是为每个字符串生成的。

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

StringBuffer extends Object class directly and it does not override hashCode from Object class. So the implementation of StringBuffer::hashCode is the same as for Object::hashCode.

StringBuffer class 不会覆盖从 Object class 继承的 hashCode() 方法StringBuffer 实例 Object class 的 hashCode 实现被使用。

这是因为 StringBuffer 是一个可变对象,与 String 不同,您可以在 StringBuffer 对象创建后轻松修改其状态。这使得它不适合用于任何基于 "hash" 的数据结构,例如 HashMap,因为它会不一致。

Objectclass的hashCode方法是native方法,一般通过将对象的内部地址转换为整数作为哈希码值来实现,也可以不是因为它依赖于 JVM 的内部实现,而是在不可变的 String class 中 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().

都是一样的