咱们在不少博客的文章当中,咱们都看到这样一句话:在重写equals方法的同时必定要重写hashCode方法。这是为何?不少人会说,个人业务代码,只用equals比较比较两个对象是否相等不就能够了,为何要重写hashcode?spa
其实上面说的话不彻底是错的,若是说你的对象在业务里永远不会放入到hash容器当中,彻底不用考虑重写hashcode方法的问题,可是你的对象若是要放到HashMap这样的以hash code为基础的容器中时,就要考虑重写hashcode方法。code
再准确一点的说,若是你的对象在HashMap、HashTable等中要做为key存放的时候,还有对象放到HashSet中时,就必定要重写equals和hashcode。为何?咱们来看一下HashSet的add方法的实现吧。对象
HashSet的add方法调用了HashMap的put方法,由于HashSet的底层本质,仍是一个Map,只是value是一个固定的Object对象。博客
HashMap中,e.hash其实就是key的hash值。HashMap判断key值是否相同的步骤是:hash
综合上面的两个条件,咱们常常有这么一个场景。有两个Personal对象,要放在HashSet中,若是idCard相等,就是同一我的,存放一个对象。这时咱们就不能只简单的重写equals方法了,由于第一步是调用hashCode方法,两个对象的hashCode是不相等的,第一个判断条件已是false,就不会再继续使用条件2的equals进行判断,Set中会存放一个新对象。因此,这时咱们重写equals方法的同时,就要重写hashCode,使第一个判断条件永远为true,再使用equals进行idCard的比较。容器