我们在很多博客的文章当中,我们都看到这样一句话:在重写equals方法的同时一定要重写hashCode方法。这是为什么?很多人会说,我的业务代码,只用equals比较比较两个对象是否相等不就可以了,为什么要重写hashcode?
其实上面说的话不完全是错的,如果说你的对象在业务里永远不会放入到hash容器当中,完全不用考虑重写hashcode方法的问题,但是你的对象如果要放到HashMap这样的以hash code为基础的容器中时,就要考虑重写hashcode方法。
再准确一点的说,如果你的对象在HashMap、HashTable等中要作为key存放的时候,还有对象放到HashSet中时,就一定要重写equals和hashcode。为什么?我们来看一下HashSet的add方法的实现吧。
HashSet的add方法调用了HashMap的put方法,因为HashSet的底层本质,还是一个Map,只是value是一个固定的Object对象。
HashMap中,e.hash其实就是key的hash值。HashMap判断key值是否相同的步骤是:
- 判断key的hash值是否相等,这个判断是使用的HashMap中的hash方法,该方法的实现中,如果对象不是String,会直接调用该对象的hashCode方法
- 同时判断key的地址是否相等或者equals相等。
综合上面的两个条件,我们经常有这么一个场景。有两个Personal对象,要放在HashSet中,如果idCard相等,就是同一个人,存放一个对象。这时我们就不能只简单的重写equals方法了,因为第一步是调用hashCode方法,两个对象的hashCode是不相等的,第一个判断条件已经是false,就不会再继续使用条件2的equals进行判断,Set中会存放一个新对象。所以,这时我们重写equals方法的同时,就要重写hashCode,使第一个判断条件永远为true,再使用equals进行idCard的比较。
来源:oschina
链接:https://my.oschina.net/u/267473/blog/734775