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条)

报告相同问题?

悬赏问题

  • ¥200 如何使用postGis实现最短领规划?
  • ¥15 pyinstaller打包错误
  • ¥20 cesm的气溶胶排放文件
  • ¥15 逐月累计,月份不连续,补齐月份
  • ¥15 应用简单的Python代码完成一个学生成绩管理系统
  • ¥15 用matlab求微分方程初值问题
  • ¥15 vscode下编写第三方库opencv与pcl代码时没有代码提示
  • ¥15 能够跑通不报错,如何解决?(标签-matlab)
  • ¥15 MOS在RDS较大,频率高时开关波形异常
  • ¥15 SCENIC分析报错求解答