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

1.关于equals

  equals() 作用不能用于判断基本数据类型的变量,只能用来判断两个对象是否相等。equals()方法存在于Object类中,而Object类是所有类的直接或间接父类。

Object 类 equals() 方法:

public boolean equals(Object obj) {
     return (this == obj);
}

equals() 方法存在两种使用情况:

  • 类没有覆盖 equals()方法 :通过equals()比较该类的两个对象时,等价于通过“==”比较这两个对象,使用的默认是 Objectequals()方法。
  • 类覆盖了 equals()方法 :一般我们都覆盖 equals()方法来比较两个对象中的属性是否相等;若它们的属性相等,则返回 true(即,认为这两个对象相等)。

2.关于hashCode 

  hashCode() 的作用是获取哈希码,也称为散列码;它实际上是返回一个 int 整数。这个哈希码的作用是确定该对象在哈希表中的索引位置。hashCode()定义在 JDK 的 Object 类中,这就意味着 Java 中的任何类都包含有 hashCode() 函数。另外需要注意的是: Object 的 hashcode 方法是本地方法,也就是用 c 语言或 c++ 实现的,该方法通常用来将对象的 内存地址 转换为整数之后返回。 

3.为什么重写 equals 时必须重写 hashCode 方法?

为了确保:

        当我们用equals方法得到两对象相等时,则它们的hashCode也相等。

        只重写equals方法,可能会出现equals返回true,但hash不等。hash类存储结构(HashSet、HashMap等等)添加元素会有重复性校验,校验的方式就是先取hashCode判断是否相等(找到对应的位置,该位置可能存在多个元素),然后再取equals方法比较(极大缩小比较范围,高效判断),最终判定该存储结构中是否有重复元素。

参考:

Java 泛型了解么?什么是类型擦除?介绍一下常用的通配符? (gitee.io)

为什么重写equals方法,还必须要重写hashcode方法_代码君的博客-CSDN博客_为什么重写equals还要重写hashcode

猜你喜欢

转载自blog.csdn.net/li1593891525/article/details/121335200