关于hashCode()与equals()的总结,所要知道的

时间:2021-07-01 16:48:11

HashCode的存在主要是用于查找的快捷性(性能),比如在set集合中,元素不可重复, equals方法可用于保证元素不重复,但是,如果每增加一个元素就检查一次,如果集合中现在已经有1000个元素,那么第1001个元素加入集合时,就要调用1000次equals方法。这显然会大大降低效率。


我们来看一下增加一个对象到集合中hashCode是怎么运行的:

当集合要添加新的对象时,先调用这个对象的 hashCode方法,得到对应的hashcode值(每一个实例对象在被创造时,总会有一个自己的hashcode),实际上在HashMap的具体实现中会用一个table保存已经存进去的对象的hashcode 值,如果table中没有该hashcode值,它就可以直接存进去,不用再进行任何比较了;如果存在该hashcode值, 就调用它的equals方法与新元素进行比较,相同的话就不存了,不相同就散列其它的地址(也就是发生了Hash key相同导致冲突的情况,那么就在这个Hash key的地方产生一个链表,将所有产生相同HashCode的对象放到这个单链表上去,串在一起(很少出现)。)。所以这里存在一个冲突解决的问题,这样一来实际调用 equals方法的次数就大大降低了。


任何时候,两个不同对象有相同的哈希码,我们称之为希哈码冲突。冲突不要紧,它只是意味着有多个对象在同一个空间里,所以 HashMap 会再检查一遍来找正确的对象。大量的冲突将会降低系统的性能,但是它们不会导致错误的结果。


一个HashSet集合中判断两个元素相等的标准是 1、两个对象通过equals()方法比较相等;2、两个对象的hashcode()方法返回值也相等。也就是说两个条件如果有一个不成立(增加的元素与集合内元素不相等),对象就会被加入到Hashset集合中。


如果需要把一个类对象保存到hashset集合中,重写这个类的equals()方法和hashcode()方法时,应尽量保证两个对象通过equals()方法比较返回true时,它们的hashcode()方法返回值也相等。这是因为如果不这样做的话,一个与集合内相同的对象也可以被加入到hashset集合中,hashset本身要求元素不能相同,HashSet就失去了他本身的意义了(不能有相同的元素)。