我很好奇Java如何通过使用Object API的hashCode()方法生成哈希值?
Object
的 hashCode()
实际上是本地方法,其实现并非纯 Java。至于它的工作原理,Tom Hawtin的这个回答做得很好:
许多人声称
Object.hashCode
将返回内存中对象表示的地址。在现代实现中,对象实际上在内存中移动。相反,一个对象头的区域用于存储该值,该值可能会在首次请求该值时从内存地址中惰性派生。
整个答案都值得一读。
Java不会自动生成hashCode(),也就是说这里没有自动发生任何事情。然而,Object
会根据对象实例的内存地址生成一个HashCode。大多数类(特别是如果您将其用于任何 Collection
API中)都应该实现自己的HashCode(并按照契约实现自己的equals方法)。
Person person1 = new Person();
person1.setName("Alex");
Person person2 = new Person();
person2.setName("Alex");
Person person3 = person2;
public int hashCode(String str)
{
int h = 0;
for (int i = 0; i < str.Length; i++)
h = (h * 31) + str[i];
return h;
}
编辑:此处未进行溢出检查,因此哈希码可能为正数或负数。
Object.hashCode()使用System.identityHashCode(),它基于给定对象的ID号。
这些信息来自这里。
Java不会为您生成有意义的hashCode
,作为程序员,生成有用的hashCode
是您的工作。默认的hashCode
只是内存位置。
hashCode
方法输出一个数字值。如果对象不改变,那么对象的哈希码始终相同。需要注意的是,哈希码不一定是唯一的。
默认的hashCode()实现方式是根据对象的地址返回对象的哈希码。JVM会根据对象的地址自动生成这个唯一的数字。
如果两个对象位于同一内存位置(即由两个引用变量引用的同一对象),则两者的哈希码相同;但如果两个对象位于不同的内存位置,则两个对象的哈希码将不同。
你可能问这个问题是因为你需要重写这个方法。但是,什么时候需要重写呢?
默认的hashCode()方法返回基于对象地址的哈希码(对象的唯一标识)。但是,如果我的应用程序需要根据某些不同的参数(而不是对象的地址)来唯一标识对象,则我应该重写hashCode()方法,并根据要求给出实现。
关于这个主题,《Effective Java》有一个重要的注释:
更多信息,请查看此Java hashcode示例。