想要明白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方法可能相等,可能不等。