“ HashSet 如何检查重复”为例⼦来说明为什么要有 hashCode ?

当你把对象加⼊ HashSet 时, HashSet 会先计算对象的 hashCode 值来判断对象加⼊的位置,同时也会与其他已经加⼊的对象的 hashCode 值作比较如果没有相符的hashCode , HashSet 会假设对象没有重复出现。但是如果发现有相同 hashCode 值的对象,这时会调⽤ equals() ⽅法来检查 hashCode 相等的对象是否真的相同。如果两者相同, HashSet 就不会让其加⼊操作成功。如果不同的话,就会重新散列到其他位置。这样我们就⼤⼤减少了 equals 的次数,相应就⼤⼤提⾼了执⾏速度。

hashCode() 和 equals() 都是⽤于比较两个对象是否相等

JDK 还要同时提供这两个⽅法?

在⼀些容器(⽐如 HashMap 、 HashSet )中,有了 hashCode() 之后,判断元素是否在对应容器中的效率会更⾼(参考添加元素进 HashSet 的过程)!

不只提供 hashCode() ⽅法呢?

这是因为两个对象的 hashCode 值相等并不代表两个对象就相等。

==哈希碰撞也就是指的是不同的对象得到相同的hashCode==

总结

  • 如果两个对象的hashCode值相等,那么这两个对象不一定相等(哈希碰撞)
  • 两个对象的hashCode值想到并且equals()方法也返回true,这两个对象是相等的
  • 两个对象的hashCode值不相等,那么两个对象一定不相等

拓展知识

为什么重写equals()方法时,hashCode方法也必须重写?

因为两个相等对象的hashCode值也必须相等.

如果重写equals()时,没有重写hashCode方法,可能导致equals()方法判断两个值相等,hashCode()值却不相等.

总结

  • equals方法判断两个对象是相等,那么两个对象的hashCode值一定相等
  • 两个对象有相同的hashCode,他们也不一定是相等的(哈希碰撞)