logo

为什么重写 equals 时必须重写 hashCode ⽅法?

什么是HashCode?

hashCode() 的作⽤是获取哈希码,也称为散列码;它实际上是返回⼀个 int 整数,定义在 Object 类中,这个⽅法通常⽤来将对象的内存地址转换为整数之后返回。这也意味着Java中的任何类都包含有hashCode()函数。

为什么要有 hashCode ?

哈希码主要在哈希表这类集合映射的时候⽤到,哈希表存储的是键值对(key-value),它的特点 是:能根据“键”快速的映射到对应的“值”。 比如HashMap怎么把key映射到对应的value上呢?⽤的就是哈希取余法,也就是拿哈希码和存 储元素的数组的长度取余,获取key对应的value所在的下标位置

为什么重写 quals 时必须重写 hashCode ⽅法?

  • 如果两个对象相等,则hashcode一定也是相同的
  • 两个对象相等,对两个对象分别调用equals方法都返回true
  • 两个对象有相同的hashcode值,它们也不一定是相等的(哈希碰撞)

hashCode() 的默认⾏为是对堆上的对象产⽣独特值,如果没有重写 hashCode() ,则该class 的 两个对象⽆论如何都不会相等(即使这两个对象指向相同的数据)。因 此,equals() ⽅法被覆盖过,则 hashCode() ⽅法也必须被覆盖。