在Java中,每一个对象都有一个容易理解但是任然有时候被遗忘或者被误用的hashcode()方法.这里有3件事情要时刻牢记以避免常见的陷阱.
一.hashCode契约
这个契约在hashcode方法的JavaDoc中进行了阐述.它可以大致的归纳为下面几点:
1.在一个运行的进程中,相等的对象必须要有相同的哈希码.
请注意这并不意味着以下的常见的误解:
2.不相等的对象一定有着不同的哈希码------>错!
3.有同一个哈希值的对象一定相等.--------->错!
通过上图可以帮助理解契约规则.
这个契约允许不同的对象共享相同的哈希码.
二.哈希码冲突
任何时候,两个不同对象有相同的哈希码,我们称之为冲突.冲突不要紧,它只是意味着有多个对象在同一个空间里,所以HashMap会再检查一遍来找正确的对象.大量的冲突将会降低系统的性能,但是它们不会导致错误的结果.
三.哈希码可变
最后,在哈希码的契约中,有一个很重要的细节是相当让人吃惊的:hashcode并不保证在不同的应用执行中的得到相同的结果.让我们看一看Java文档:
在一次Java应用的执行中,对于同一个对象,hashcode方法必须始终返回相同的整数,但这整数不反映对象是否被修改(equals比较)的信息.同一个应用的不同执行,该整数不必保持一致.