1、为什么重写了equals方法一定要重写hashcode方法
结论:
- hashCode方法返回的哈希值决定了对象在像hashSet、hashMap等哈希集合中的位置,
如果只重写了equals但没重写hashcode,那么就会在该对象进行哈希集合相关的存储时出现问题,比如两个equals为true的对象会出现在hashSet集合中,两个equals为true的key在hashMap中存在两个。
解析:
- 哈希值是hashCode本地方法由对象推导出的一个整型值,一般两个内存地址不同的对象,哈希值基本不一样,但也有一样的情况,也就是哈希冲突。
- 哈希集合的插入处理是这样的:先通过哈希值确认位置,如果哈希值冲突,则通过equals判断两个对象是否相等,如果equals相等,则两个对象是相等的对象,进行替换;否则两个对象不是相等的对象,要么线性探针,要么链表解决冲突;如果哈希值不冲突,则直接插入。
- 所以在插入哈希集合时,都会先进行哈希值的判断,如果只重写了equals没重写hashcode,就会导致两个equals相等的对象,在一开始就因为hashcode不相等,直接在集合进行插入。
- 因此,我们需要重写hashcode,使得其equals相等的情况下,也得保证其哈希值一样,这样在进行哈希集合的操作时才不会出现问题。