【问题标题】:Use String hashCode() Method? [closed]使用 String hashCode() 方法? [关闭]
【发布时间】:2013-11-14 18:22:42
【问题描述】:

来自链接:

http://www.tutorialspoint.com/java/java_string_hashcode.htm

Relationship between hashCode and equals method in Java

Good hashCode() Implementation

但我无法理解哈希码。

这是一个例子:

public class StringDemo {
    public static void main(String args[]){
        String strob1="first string";
        System.out.println(strob1.hashCode());
    }

    }

这个简单的程序给我输出:-5468287

谁能告诉我: 它如何给我输出:-5468287

【问题讨论】:

  • 源代码可在线获得或在您的 JDK 安装中获得。
  • 您是否只是对哈希码的一般用途感到困惑?我看了一点,发现了这个:isagoksu.com/2009/development/java/what-is-hash-code
  • 我可以理解why这个问题,但是在哪里?在String.hashCode 当然,还有其他地方。

标签: java string java-7 hashcode java-8


【解决方案1】:

字符串的hash code 计算为:

s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]

使用int算术,其中s[i]是字符串的第i个字符,n是字符串的长度,^表示求幂。 (空字符串的哈希值为零。)

因此,这个整数计算很容易发生溢出,导致根据Java Language specification-15.8.2为负:

如果整数加法溢出,则结果为低位 一些足够大的数学和的位 二进制补码格式。如果发生溢出,则 结果与两者的数学和的符号不同 操作数的值。

【讨论】:

    【解决方案2】:

    本质上,除非您正在编写数据结构(您很可能不必这样做),否则您不会自己调用它。

    但是,您通常会实施一个。现在几乎所有的 IDE 都提供了自动生成 equals 和 hashCode 的功能。我建议暂时使用它;每当你实现 equals 时,也会生成一个 hashCode 实现。

    【讨论】:

      【解决方案3】:

      为什么?该方法在 java.lang.Object 中定义。您定义的任何类都会继承它。

      请参考enter link description here

      什么?我建议你更多地研究什么是散列。 Wiki hash functions.

      【讨论】:

        【解决方案4】:

        哈希码用于允许将对象存储在Map 对象中(或与使用哈希的其他数据结构一起)。哈希码的目标是为具有不同值的对象提供唯一值,但如果对象相同,则生成相同的哈希码。这本质上是要查找的对象的唯一索引。

        实现Map 接口的HashMap 依赖于hashcode() 的良好实现,以便在不同对象之间均匀分布以获得最佳性能。有了这个,它可以为 get() 等操作提供 O(1) 平均案例速度。

        因此,如果您打算将自定义对象用作 key 来创建 HashMap,则应提供 hashcode() 的实现,大多数 IDE 都会为您提供帮助。

        编辑:在-5468287 的示例输出中,这是它的哈希码值。如果您查看 "first strings" 的哈希码,它仅相差一个字符,它应该是一个完全不同的数字,这是一件好事,因为它有助于在 Map 中均匀分布对象。

        【讨论】:

        • hashCode 方法适用于任何使用散列的数据结构,而不仅仅是Map。任何使用哈希表的数据结构都使用哈希,还有其他使用哈希的结构,例如哈希树。或者您希望能够快速消除两个项目相等的可能性而无需检查每个成员的任何其他情况。
        • @AJMansfield 你说得对,我指的是最常见的用例。我修改了措辞,使其更笼统。
        猜你喜欢
        • 1970-01-01
        • 2021-11-27
        • 1970-01-01
        • 2011-10-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-29
        相关资源
        最近更新 更多