想要明确hashCode的作用,必须要先知道java中的集合。(不明确的请看Java基础之集合框架具体解释(二)List篇和Java基础之集合框架具体解释(三)Set篇)
Java中的Collection集合有两类。一类是List,还有一类是Set,前者集合内的元素是有序的,元素能够反复;后者元素无序且元素不可反复。
而我们通常使用Object.equals方法来推断两个元素是否反复。即当我们想查找一个元素中是否包括某个对象时。就是逐一取出每一个元素与要找的元素进行比較。当发现某个元素与要查找的对象进行equals方法比較的结果相等时。则停止继续查找并返回肯定的信息,否则返回否定的信息。假设一个集合中有非常多元素譬如成千上万个元素。而且没有包括要查找的对象时,则以为着我们的程序须要从该集合中取出成千上万个元素进行逐一比較才干得到结果,于是,有人发明了一种哈希算法来提高从集合中查找元素的效率。这样的方式将集合分成若干个存储区域。每一个对象能够计算出一个哈希码,能够将哈希码分组,每组相应某个存储区域,依据一个对象的哈希码就能够确定该对象应该存储的那个区域。
hashCode能够这样理解:它返回的就是依据对象的内存地址换算出的一个值。这样一来,当集合要加入新的元素时,先调用这个元素的hashCode方法,就一下子能定位到它应该放置的物理位置上。
假设这个位置上没有元素,它就能够直接存储在这个位置上了,不用再进行不论什么比較了。假设这个位置上已经有元素了,就调用它的equals方法与新元素进行比較,同样的话就不存了,不同样就散列其它的地址。
这样一来实际调用equals方法的次数就大大的减少了。差点儿仅仅须要一两次。
因为使用哈希算法的高效率。Set接口的重要实现类hashSet实际上就是採用的哈希算法来推断反复元素。具体请移步Java基础之集合框架具体解释(三)Set篇
小结:
- 仅仅有类的实例对象要被採用哈希算法进行存储和检索时。这个类才须要按要求覆盖hashCode方法。及时程序可能临时不会用到当前类的hashCode方法,可是为它提供一个hashCode方法也没有什么不好,没准以后什么时候又用到这种方法了,所以通常要求hashCode方法和equals方法同一时候被覆盖。
- equals方法相等的两个对象。hashCode方法一定相等,equals方法不相等的两个对象,却不能证明他们的hashCode方法不相等。换句话说equals方法不相等的两个对象。hashCode有可能相等。
反过来。hashCode方法不相等的两个对象,一定能推出equals方法也不等。hashCode方法相等的两个对象。equals方法可能相等。可能不等。