Pfeffer 2017-08-15 02:51 采纳率: 50%
浏览 1053
已采纳

HashCode 和 equals java基础知识

初学者: 请非常通俗的解释:

我把HashCode理解为是大楼的本牌号,真实地址是经纬度。
经纬度不可变,但是大楼的门牌号却是可以变的。

现在请如上通俗的告诉我: 为什么我equals变,HashCode 也要变。
1.我目前知道的就是Object中的equals和HashCode都是最基本的,需要重写。
2. 还知道String类,equals通常是先比较地址,然后一个字符一个字符比较。

还有就是我想知道HashCode存在的意义是什么,不要说什么进程怕被扰乱,我看不懂

  • 写回答

8条回答 默认 最新

  • 怪叔叔爱猫猫 2017-08-15 05:42
    关注

    假定我现在有一个数组 A[] arr = new A[11],我想向其中存储一系列的A对象,我的要求是取的时候特别方便,不用循环,可以直接找到对象的位置,那应该怎么做呢~?
    对于一个对象A a , 如果我可以通过某种固定的算法f得到一个值hashCode , 那么我就可以通过这样的方法把A放入数组:
    int index = hashCode % arr.length
    通过这个算法得到一个索引,因为是模arr.length ,那么这个索引肯定是大于等于0小于arr.length 的,我可以把对象a放入数组arr[index]中,
    这样如果我需要从数组中取出a,我就不用遍历数组去一个个找a在哪个位置,我只用再一次使用上面那个算法,算出索引,通过这个索引,我就可以直接拿到a了。
    这就是hashCode存在的意义。

    接下来说为什么重写了equals 还要重写 hashCode,假定现在有这样的场景
    两个对象 A a 和 A b,在我们的场景中我们可能需要重写equals, 判定如果 a 的 属性 name 和 b 的属性 name相等,那我就认定a,b是相同的对象,在向数组 arr里存的时候,我就不能再存多个,只存一个。但是 我们是用hashCode()去计算a,b的位置,默认从Object继承来的hashCode是基于对象的ID实现的 , 也就是说可能这两个对象在我们重写了equals()之后认为是相同的对象,但是hashCode()却不一样,在向数组里存的时候,被判定为不同的对象存到不同的索引中去了,所以我们需要重写hashCode()方法,使得如果我们重写的equals()判定两个对象是相同对象的话,那他们的hashCode()也要返回相同的数值。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(7条)

报告相同问题?

悬赏问题

  • ¥15 HFSS 中的 H 场图与 MATLAB 中绘制的 B1 场 部分对应不上
  • ¥15 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?