java内有散集合HashSet、HashMap以及HashTable,它们的底层都是源于hash实现的,hash即通过映射像 y=ax+b 一样将对象与某个值映射起来这样查找起来就快了很多,理论上查找时间是O(1),即查找每个元素花费的时间都一样,hashcode就相当于y,x就是具体的某个对象或基础数据,基于hashcode我们可以实现hash查找。
以HashMap为例,HashMap的具体实现中会用一个table保存已经存进去的对象的hashcode值,当我们存入数据会经过一下过程:
1、比较table中没有该hashcode值,没有它就可以直接存进去
2、如果存在该hashcode值, 就调用该hashcode指向对象的equals方法与新元素进行比较,不同则存进去,相同就放弃存储。
扩展:从以上步骤也可看出存在hashcode相同对象不同的情况,因此这就需要解决冲突了,即如何存储两个hash值一样的对象。
根据以上信息我们应当可以解释在重写hashCode同时,为什么必须重写equals方法,我们重写了hashcode,但equals实际上用的还是通过原来Object带的hashcode来比较两个对象是否一致的,因此为了保持一致我们重写了一个对象的hashcode时,同时需要将equals方法重写。