1、hashCode有什么用?
hashCode()的作用是获取哈希码(int 整数),也称为散列码,哈希码的作用是确定该对象在哈希表中的索引位置。
hashCode()定义在JDK的Object类中,这就意味着Java中的任何类都包含hashCode
2、为什么要有hashCode?
以HashSet如何检查重复为例来说明为什么要有hashCode?
当把一个对象加入HashSet时,HashSet会先计算这个对象的HashCode值来判断对象插入的位置,同时也会与其他已经加入的对象的hashCode值作比较,如果没有相同的HashCode值,HashSet会认为没有重复的对象出现;但如果发现有相同的HashCode值,这时会调用equals()方法来检查HashCode值相等的对象是否真的相同,如果两者相同,HashSet就不会让其加入操作,如果不同的话,就会重新散列到其他位置,这样就大大减少了equals的次数,相应就大大提高了执行速度。
其实,hashCode()和equals()方法底层都是用于比较两个对象是否相等。
3、为什么JDK还要同时提供两个方法呢?
这是因为在一些容器中(HashMap、HashSet)中,有了hashCode()之后,判断元素是否在对应容器中的效率会更高(参考添加元素HashSet的过程),也就是说HashCode帮我们大大缩小了查找成本。
那为什么不只提供HashCode()方法呢?
这是因为两个对象的HashCode值相等,并不代表两个对象就相等。
那为什么两个对象有相同的HashCode值,却不一定相等呢?
这是因为HashCode()所使用的哈希算法刚好会让多个对象传回相同的哈希值,越糟糕的哈希算法越容易碰撞,也即哈希冲突(不同的对象得到相同的哈希值),这也与数据值域的分布特性有关
4、为什么重写equals()方法时必须重写hashCode()方法?
两个相等的对象,HashCode值必须相等,如果使用equals()方法判断两个对象是相等的,那这两个对象的HashCode值也要相等。
如果重写equals()方法时没有重写HashCode()方法,就会导致equals()方法判断的是两个相等的对象,HashCode值却不相等。
总结来说就是:
- 如果两个对象的HashCode值相等,那这两个对象不一定相等(哈希冲突)
- 如果两个对象的HashCode值相等,并且equals()方法也返回true,才认为这两个对象相等
- 如果两个对象的HashCode值不相等,则可以直接认为这两个对象不想等