目录
作用
为什么要有hashCode()?
为什么重写equals()时必须重写hashCode()方法?
作用
(1)hashCode()是Object类中的native(本地)方法,底层使用c/c++语言实现,用于获取该对象的HashCode哈希码。
(2)HashCode哈希码是该对象的内存地址通过哈希Hash算法计算出的一个整数值,代表该对象在哈希表中的位置,作用主要是为了提高查找对象的快捷性,通过HashCode可以快速定位对象的存储地址。
(3)两个对象进行比较,先通过HashCode比较,如果HashCode相等,在调用equals()方法比较,提高效率。
为什么要有hashCode()?
//以“HashSet 如何检查重复”为例子来说明为什么要有hashCode()?
- 当你把对象加入HashSet时,HashSet会先获取该对象的hashCode值,来计算该对象加入的位置,同时与其他已经加入的对象的hashCod值作比较;
- 如果没有重复的hashCode,HashSet会假设对象没有重复出现,正常添加;
- 如果发现有相同hashCode值的对象,这是会调用equals()方法来检查hashCode相等的对象是否真的相同;
- 如果两者相同,HashSet就不会让其加入操作成功;
- 如果两者不同,就会重新散列到其他位置;
- 这样就大大减少了equals()的执行次数,相应就提高了执行速度;
为什么重写equals()时必须重写hashCode()方法?
equals()方法和hashCode()方法之间的关系应符合:
(1)如果两个对象相同(即:用equals比较返回true),那么它们的hashCode值一定要相同;
(2)如果两个对象的hashCode相同,它们不一定相同(用equals比较)。
例如:字符串“通话”和“重地”,hashCode值相同;
- 综上所述,在每个覆盖了equals()方法的类中,也必须覆盖hashCode()方法,如果不这样做的话,就会违反Object.hashCode的通用约定,从而导致该类无法结合所有基于散列的集合一起正常运作,例如:HashMap,HashSet和HashTable等集合。
- 另外,可以避免equals()被频繁调用,减少性能开销;