恶补java基础(三) hashCode 与 equals

113 阅读2分钟

「这是我参与2022首次更文挑战的第6天,活动详情查看:2022首次更文挑战」。

前言

equals方法是个java程序员都要了解的一个方法,其内容是最为基础的。出过的面试题也是非常多,也算是面试中的高频考点,与其类似的一个方法是hashCode这两个经常被拿在一起问。比如 重写equals为什么也要重写hashCode?hashCode和equals在HashMap中的应用..,等等,本篇章我们着重跟着题目来讲述这两个方法。

image.png

hashCode

hashCode也就是hash码,在Object中他是一串int类型返回值的一个本地方法,int的大小大家都知道,它并不是很大但也不小,hashCode的取值范围也就是int的范围,但是虽然int的大小不小但是对于hashCode来说大小并不是它最看中的点,hashCode最看中的点是分布均匀,而这也就是他使用int 而不是用其他类型,因为基本的int就已经够用。

HashCode主要用于HashMap、HashTable这两个需要key/value快速精准定位存储结构,hashCode由于采用int那么它肯定会重复,而这重复就是我们所说的Hash冲突,那么重复了怎么解决呢?在数据结构中我们学过解决hash冲有两种方式:1. 拉链法 2. 开放定址法,在上面两个结构中采用拉链法解决hash冲突,拉链法具体是什么我们在以前的HashMap中有讲这里就不展开了,自行去主页查找一下。

回到主题,hashCode可以理解为就是拿来定位下标使用的,而HashCode会冲突也就意味着他不能当做唯一键来使用,不然它也不会导致冲突了,那么冲突之后我们有一个方法来继续定位具体值在哪里,那就是equals。

equals

equals在Obj方法中对比的是他的引用地址,当然你要是String、Integer那种需要对比类中的信息的老老实实重写equals来实现值对比,但是重写equals这里需要注意,一般情况下重写你需要解决这个定式问题:

HashCode相同,equals也不一定相同 HashCode不同,equals一定不相同

否则HashMap、HashTable使用时会出现问题。这也是为什么你重写hashCode或equals时需要把对方也重写了,不然在某些结构中会出现问题。

总结

  1. 重点:HashCode相同,equals也不一定相同
  2. HashCode用于快速计算寻找下标
  3. HashCode其实是为了增加效率而研发出来,如果hashcode不相同那么就不需要进行equals了,大大节省效率