java的hashCode()方法是如何工作的?

Hel*_*nar 17 java hash hashtable object

我很好奇java如何使用Object API的hashCode()方法生成哈希值?

Pas*_*ent 24

hashCode()Object实际上是一个本地方法和实现其实不是纯Java.现在,关于它的工作方式,Tom Hawtin的答案在解释它时做得非常好:

许多人会声称Object.hashCode会在内存中返回对象表示的地址.在现代实现中,对象实际上在内存中移动 而是使用对象标题的区域来存储该值,该值可以在首次请求该值时从存储器地址延迟地导出.

整个答案实际上值得一读.


Mar*_*ell 10

Java不生成hashCode(),即此处没有自动发生.但是,Object根据对象实例的内存地址生成HashCode.大多数类(特别是如果你要在任何CollectionAPI中使用它)应该实现自己的HashCode(并通过契约他们自己的equals方法).

  • hashCode使用内存地址的想法是一个历史人工制品http://stackoverflow.com/questions/36236615/does-object-tostring-or-object-hashcode-ever-give-the-memory-address-of-the- OBJE (3认同)

JCa*_*sso 5

根据Java Platform API文档,哈希码的计算基于Object的32位内部JVM地址.

确实,对象在执行期间移动(AFAIK唯一的原因是垃圾收集器).但哈希码不会改变.

所以当你有这样的对象时

Person person1 = new Person();
person1.setName("Alex");

Person person2 = new Person();
person2.setName("Alex");

Person person3 = person2;
Run Code Online (Sandbox Code Playgroud)

在这种情况下,person1.hashCode将不等于person2.hashCode,因为这两个对象的内存地址不同.

但是person2.hashCode将等于person3,因为它们指向同一个对象.

因此,如果您需要为对象使用hashCode方法,则必须自己实现它.

顺便说一下String.hashCode的实现是不同的.它是这样的:(C#语法)

public int hashCode(String str)
{
  int h = 0;

  for (int i = 0; i < str.Length; i++)
    h = (h * 31) + str[i];

  return h;
}
Run Code Online (Sandbox Code Playgroud)

编辑:这里没有进行溢出检查,因此hashCode可能是正数或负数.