【问题标题】:How hash code is generated for StringBuffer object in java? [duplicate]java中如何为StringBuffer对象生成哈希码? [复制]
【发布时间】:2020-01-04 05:31:11
【问题描述】:

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

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

【问题讨论】:

标签: java string hashcode stringbuffer


【解决方案1】:

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());

这将输出falsetrue。这是因为String实例实际上是使用对象的状态来计算哈希码,所以s1.toString()s2.toString()都是一样的。

【讨论】:

  • @JasmeetSingh,不客气。
  • 对不起,这个答案实际上是不正确的。在现代 JVM 中,机器地址通常不用于生成身份哈希码。请参阅链接的问答。
  • @StephenC 我使用了Java文档的参考形式,它似乎没有进入实现技术,感谢链接我会更新答案。
【解决方案2】:

StringBuffer 直接扩展Object 类,它不会从Object 类覆盖hashCode。所以StringBuffer::hashCode的实现和Object::hashCode的实现是一样的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-09
    • 2019-11-30
    • 2018-04-02
    • 1970-01-01
    • 2011-07-30
    • 1970-01-01
    相关资源
    最近更新 更多