为什么要重写hashCode()和equals()方法
一、hashCode()和equals()是什么
hashCode()方法和equals()方法的作用是其实一样的,都是用来对比两个对象是否相同
二、hashCode()和equals()的区别
从下面两个角度来看待:
1.equals()既然已经实现了对比的功能,为什么还要hashCode()呢?
因为重写的equals()里面一般比较的比较全面,比较复杂,这样效率就比较低了,而利用hashCode()进行对比,则只生成一个hash值进行比较就可以了,效率很高
2.hashCode()效率这么高为什么要重写equals()呢?
因为hashCode()并不是完全可靠,有时候互通的对象生成的hashCode也会一样,所以并不是完全可靠,所以要重写equals()方法
记住两句话
- equals()相等的两个对象,他们的hashCode()肯定相等。
- hashCode()相等的两个对象,equals()不一定相等。
三、hashCode()和equals()使用的注意事项
- 只要重写了equals()方法就必须重写hashCode()方法
- 因为Set存储的是不重复的对象,依据hashCode()和equals()方法来进行判断,所以Set存储的对象必须重写这两个方法。
- 如果Map集合存储的是自定义的key作为键的话,就必须重写这两个方法。
- String类已经重写了这两个方法,所以我们可以直接使用,不需要重写。
- 只要当类需要存放HashTable、HashMap、HashSet等等,hash结构的集合时,就需要重写hashCode().
什么情况下hashCode是相等的?
-
如果 key 相等,hashCode 必须相等
-
如果 key1 和 key2 冲突了,hashCode 也相等(不是要求,只是冲突了)