• 面试必问系列——重写equals为什么一定要重写hashcode


      重写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扩容阈值和链表转红黑树阈值问题

  • 相关阅读:
    系列化与反系列化
    改造一下C# Substring()函数
    在C#后端处理一些结果然传给前端Javascript或是jQuery
    ASP.NET MVC传送参数至服务端
    MySQL 操作命令梳理(3)-pager
    MySQL 操作命令梳理(2)-alter(update、insert)
    redis持久化策略梳理及主从环境下的策略调整记录
    php-redis扩展模块安装记录
    centos下部署redis服务环境及其配置说明
    Iptables 规则用法小结
  • 原文地址:https://www.cnblogs.com/wudb/p/12979995.html
Copyright © 2020-2023  润新知