乐趣区

hashCode的作用

以 java.lang.Object 来理解 JVM 每 new 一个 Object,它都会将这个 Object 丢到一个 Hash 哈希表中去,这样的话,下次做 Object 的比较或者取这个对象的时候,它会根据对象的 hashcode 再从 Hash 表中取这个对象。这样做的目的是提高取对象的效率。

具体过程是这样:
new Object(),JVM 根据这个对象的 Hashcode 值放入到对应的 Hash 表对应的 Key 上,如果不同的对象却产生了相同的 hash 值,也就是发生了 Hash key 相同导致冲突的情况,那么就在这个 Hash key 的地方产生一个链表,将所有产生相同 hashcode 的对象放到这个单链表上串在一起。

比较两个对象的时候,首先根据他们的 hashcode 去 hash 表中找他的对象,当两个对象的 hashcode 相同,那么就是说他们这两个对象放在 Hash 表中的同一个 key 上,那么他们一定在这个 key 上的链表上。那么此时就只能根据 Object 的 equal 方法来比较这个对象是否 equal。当两个对象的 hashcode 不同的话,肯定他们不能 equal。

java.lang.Object 中对 hashCode 的约定:

在一个应用程序执行期间,如果一个对象的 equals 方法做比较所用到的信息没有被修改的话,则对该对象调用 hashCode 方法多次,它必须始终如一地返回同一个整数。

如果两个对象根据 equals(Object o) 方法是相等的,则调用这两个对象中任一对象的 hashCode 方法必须产生相同的整数结果。

如果两个对象根据 equals(Object o) 方法是不相等的,则调用这两个对象中任一个对象的 hashCode 方法,不要求产生不同的整数结果。但如果能不同,则可能提高散列表的性能。

退出移动版