首页 > 技术文章 > 面试必问系列——重写equals为什么一定要重写hashcode

wudb 2020-05-28 13:45 原文

  重写equals为什么一定要重写hashcode,这个问题可以说是很经典的问题了,早几年我们一般都是这样回答的:因为equals相等的话,hashcode一定相等,如果hashcode相等的话,equals不一定相等,这是java规范规定的。没错,这就是老鳖的屁股,龟腚(规定),但是随着近年来就业难度的提升,这样的回答已经是错误的,或者你这样说,面试官会觉得你是一个半吊子,一知半解,所以楼主最近整理了一下资料,总结了至少今年回答还算是正确的答案。

  面试官扶了一下已经生青锈的眼镜,斜看了一下惶恐不安的你

  面试官:我们重写equals为什么一定要重写hashcode?

  我:因为java规范规定,equals相等的话,hashcode一定相等,如果hashcode相等的话,equals不一定相等

  面试官:就这,出门左拐走楼梯下去

  我拉着面试官刚擦过鼻涕的袖子,哭着说:求求你循序渐进的引导我吧,我不装逼了

  面试官:咳!你说的规定都有什么?

  我:自反性、对称性、传递性、一致性、非空性

  面试官:那为什么要这样规定呢?如果我不重写hashcode会出现什么情况?

  我:如果不重写hashcode,在map中put两个equals相等的key时,应该只存在一个键值对,后put的覆盖前面put的value,但是put方法判断key相等的条件是 hash、==和equals 由于hashcode不相等,判断条件不成立导致出现两个键值对。

  

总结:其实我们之前的回答是没问题的,但是没有深度,所以我们回答的时候需要把具体的规定和实际的使用场景带上。而且这里提到了hashmap,那不仅回答了这个问题,还对面试官带有一定的引导性,面试官大概率会接着问你hashmap相关的问题了,引导面试官问一些自己擅长的问题,而不是被面试官牵着鼻子走,毕竟你也不知道,面试官还有多少压箱底的偏题在等着你。下一篇:hashmap扩容阈值和链表转红黑树阈值问题

推荐阅读