hashcode()和equals()的是是非非

    咱们在不少博客的文章当中,咱们都看到这样一句话:在重写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

  1. 判断key的hash值是否相等,这个判断是使用的HashMap中的hash方法,该方法的实现中,若是对象不是String,会直接调用该对象的hashCode方法
  2. 同时判断key的地址是否相等或者equals相等。

    综合上面的两个条件,咱们常常有这么一个场景。有两个Personal对象,要放在HashSet中,若是idCard相等,就是同一我的,存放一个对象。这时咱们就不能只简单的重写equals方法了,由于第一步是调用hashCode方法,两个对象的hashCode是不相等的,第一个判断条件已是false,就不会再继续使用条件2的equals进行判断,Set中会存放一个新对象。因此,这时咱们重写equals方法的同时,就要重写hashCode,使第一个判断条件永远为true,再使用equals进行idCard的比较。容器

相关文章
相关标签/搜索