使用String hashCode()方法?

来自链接:

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

Java中hashCode与equals方法的关系

好hashCode()实现

但我无法理解哈希码。

这是一个例子:

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

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

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

String的哈希码计算如下:

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

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

因此,根据Java语言规范-15.8.2 ,很容易发生此整数计算的溢出,从而导致否定:

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

从本质上讲,除非您编写数据结构(您很可能不需要),否则您不会自己调用它。

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

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

请参阅此处输入链接说明 。

什么? 我建议你更多地研究什么是哈希。 Wiki哈希函数 。

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

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

因此,如果您打算使用自定义对象作为HashMapkey ,您应该提供hashcode()的实现,大多数IDE都会帮助您。

编辑:在您的示例输出-5468287 ,它是其哈希码值。 如果你看一下只有一个字符不同的"first strings"的哈希码,它应该是一个非常不同的数字,这是一件好事,因为它有助于在地图内均匀分布对象。