hashCode()和equals()的区别

引言

下面从两个角度来介绍他们的区别:性能和可靠性。他们的区别也主要体现在这两个方面

equals()既然已经能实现对比,为什么还要hashCode()?

因为重写的equals()里一般比较的比较全面且复杂,这样效率比较低,而利用hashCode()进行对比,只需要生成一个hash值进行比较就可以了,效率比较高。

hashCode()效率那么高,为什么还要equals()?

因为hashCode()并不完全可靠,有时候不同对象他们生成的hashcode也会一样,所以hahscode大部分时候是可靠,并不是绝对可靠。所以得到以下两条结论:

  • equals()相等的两个对象他们的hashCode()肯定相等
  • hashCode()相等的两个对象他们的equals()不一定相等。

拓展

阿里巴巴规定:只要重写equals(),就必须重写hashCode()

因为Set存储的是不重复对象,依据hashCode和equals进行判断,所以Set存储的对象必须重写这两个方法;如果自定义对象做Map的键,那么必须重写hashCode和equals

什么时候需要重写?

一般不需要重载hashCode(),只有当类需要放在HashTable、HashMap、HashSet等hash结构的集合时,才需要重载hashCode()

那么为什么要重载hashCode()呢?

如果你重写了equals,比如说是基于对象的内容实现的,而保留hashCode的实现不变,那么很可能某两个对象明明是“相等”,而hashCode却不一样。这样,当你用其中的一个作为键保存到hashMap、hasoTable或hashSet中,再以“相等的”找另一个作为键值去查找他们的时候,则根本找不到。

为什么equals()相等,hashCode就一定要相等,而hashCode()相等,却不要求equals()相等?

因为是按照hashCode来访问小内存块,所以hashCode必须相等。HashMap获取一个对象是比较key的hashCode相等和equals为true。之所以hashCode相等,却可以equal不等,就比如ObjectA和ObjectB他们都有属性name,那么hashCode都以name计算,所以hashCode一样,但是两个对象属于不同类型,所以equals为false。

为什么需要hashCode()?

通过hashCode可以很快的查到小内存块。通过hashCode比较比equals方法快,当get时先比较hashCode,如果hashCode不同,直接返回false。

posted @ 2022-04-07 16:38  夏醉浅梦  阅读(116)  评论(0)    收藏  举报