【发布时间】:2020-01-04 05:31:11
【问题描述】:
我正在学习 Java 中的 String,在学习的过程中,我了解到每个字符串都会生成哈希码。
想知道StringBuffer的情况下哈希码是如何产生的。
【问题讨论】:
-
这样的问题你应该考虑阅读the documentation而不是在这里问。
标签: java string hashcode stringbuffer
我正在学习 Java 中的 String,在学习的过程中,我了解到每个字符串都会生成哈希码。
想知道StringBuffer的情况下哈希码是如何产生的。
【问题讨论】:
标签: java string hashcode stringbuffer
StringBuffer 类不会覆盖从Object 类继承的hashCode() 方法,只要在StringBuffer 实例上调用hashCode,就会使用Object 类的hashCode 实现。
这是因为StringBuffer 是一个可变对象,与String 不同,您可以在StringBuffer 对象创建后轻松修改其状态。这使得它不适合在任何基于“哈希”的数据结构中使用,例如 HashMap,因为它会不一致。
Object 类的 hashCode 方法是一个本地方法,通常通过将对象的内部地址转换为整数作为哈希码值来实现,也可以不实现,因为它取决于内部实现JVM,但在不可变的 String 类中,hashCode 被覆盖并使用 String 对象的内容实现,以使其在哈希数据结构中的使用保持一致。
就像简单的实验一样,您可以运行 sn-p 来检查这个理论:
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());
这将输出false 和true。这是因为String实例实际上是使用对象的状态来计算哈希码,所以s1.toString()和s2.toString()都是一样的。
【讨论】:
StringBuffer 直接扩展Object 类,它不会从Object 类覆盖hashCode。所以StringBuffer::hashCode的实现和Object::hashCode的实现是一样的。
【讨论】: