zoukankan      html  css  js  c++  java
  • 面试必问系列——重写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扩容阈值和链表转红黑树阈值问题

  • 相关阅读:
    iframe中的页面如何触发父页面事件
    js获取gridview的值
    不出现重复数字,带干扰的验证码
    文本框内不允许输入字母
    后台调用前台JS方法
    在后台得到前台元素,给元素改变属性值或添加属性
    C#常见面试题
    Flex代码生成器 (FCG)
    c#(WinForm)遍历局域网计算机(电脑)获取IP和计算机名称
    VisualSVN Server + Tortoise SVN 使用教程(补充版)
  • 原文地址:https://www.cnblogs.com/wudb/p/12979995.html
Copyright © 2011-2022 走看看