16 两个对象值相同(x.equals(y) == true),但却可以有不同的hashCode,这句话对不对?

不对,如果两个对象x和y满足x.equals(y) == true,那么他们的哈希码应该相同。

根据hashCode方法协定:在每个重写了equals方法的类中,必须重写hashCode方法,如果不这样做的话,就会导致该类无法与基于哈希表的集合一起使用。

接下来我们以HashSet为例说明:

HashSet基于HashMap实现,底层采用HashMap保存元素,元素无序、不重复。

当向HashSet添加元素a时,首先调用a所属类的hashCode方法,计算a的哈希值,接着利用hash值通过某种算法计算出元素在HashSet底层数组中的存放位置;

判断此位置上是否有元素:如果没有,则a添加成功;如果有,假设存在元素b,则先比较a和b的哈希值;

如果哈希值不同,则a添加成功;如果哈希值相同,则继续通过调用a所属类的equals方法比较;

如果返回true,a添加失败;如果返回false,a添加成功。

分析:

以上就是集合HashSet的简要说明及实现原理,假设我们新建一个类Student,重写了equals方法(只要name相等即为true),没有重写hashCode方法,当new了两个相同name的对象stu1,stu2后,分别添加到HashSet中,首先stu1经过hashCode方法,计算哈希值,然后找到自己在数组中的存放位置,发现没有元素,添加成功;接着stu2也调用hashCode方法,但是由于没有重写hashCode方法,返回了不同的哈希值,经过计算也找到了自己在数组中要存放的位置,且该位置和stu1的不同,也添加成功,这就发生了错误,因为我们知道HashSet是不可重复的集合。

结语:

当然,如果你的类根本就不会和基于哈希表的集合一起使用,如ArrayList,你也可以不重写hashCode方法,但是,这就像是Java的一种约定,我们最好遵守它。

Original: https://www.cnblogs.com/xilichenbokeyuan/p/14167555.html
Author: 卫盾
Title: 16 两个对象值相同(x.equals(y) == true),但却可以有不同的hashCode,这句话对不对?

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/576013/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • MySQL 中如何定位 DDL 被阻塞的问题

    经常碰到开发、测试童鞋会问,线下开发、测试环境,执行了一个DDL,发现很久都没有执行完,是不是被阻塞了?要怎么解决? 包括在群里,也经常会碰到类似问题:DDL 被阻塞了,如何找到阻…

    数据库 2023年5月24日
    064
  • 解决Laravel报错No application encryption key has been specified的问题

    可能有些小伙伴从git上拉下来的项目在本地运行时会报No application encryption key has been specified的错,如图: 这是因为.env文…

    数据库 2023年6月14日
    076
  • MySQL–数据过滤(AND、OR、IN、NOT操作符)

    MySQL允许给出多个WHERE子句。这些子句可以两种方式使用:以AND子句的方式或OR子句的方式使用。 1、组合WHERE子句 此SQL语句检索由供应商1003制造且价格小于等于…

    数据库 2023年6月16日
    092
  • Linux 下统计文件夹下文件的数量

    1、查看当前目录下的文件数量(不包含子目录中的文件) 2、查看当前目录下的文件数量(包含子目录中的文件) 3、 查看当前目录下的文件夹目录个数(不包含子目录中的目录),同上述理,如…

    数据库 2023年6月14日
    081
  • Git (简单基本操作)

    1、设置配置信息 查看配置信息:git config -l 设置用户名:git config –global user.name xxx 设置邮箱:git config…

    数据库 2023年6月16日
    088
  • web 前端 基础HTML知识点

    B/S(Browser/Server):浏览器实现 优点: 规范、使用方便、本身实现成本低 容易升级、便于维护 缺点: 没有网络,无法使用 保存数据量有限,和服务器交互频率高、耗费…

    数据库 2023年6月16日
    076
  • 小姐姐用动画图解Git命令,一看就懂!

    无论是开发、运维,还是测试,大家都知道Git在日常工作中的地位。所以,也是大家的必学、必备技能之一。之前公众号也发过很多git相关的文章: 但是呢,民工哥,也经常在后台看到读者说,…

    数据库 2023年6月9日
    097
  • Java学习-第一部分-第三阶段-第一节:网络编程

    网络编程 笔记目录:(https://www.cnblogs.com/wenjie2000/p/16378441.html) 网络基础 网络通信 概念:两台设备之间通过网络实现数据…

    数据库 2023年6月11日
    0110
  • 绿色安装MySQL5.7版本—-配置my.ini文件注意事项

    简述绿色安装MySQL5.7版本以及配置my.ini文件注意事项 前言 由于前段时间电脑重装,虽然很多软件不在C盘,但是由于很多注册表以及关联文件被删除,很多软件还需要重新配置甚至…

    数据库 2023年6月16日
    0107
  • 2022-8-15 数据库 mysql 第一天

    Mysql数据库 数据库 数据库[根据数据结构组织、存储和管理数据的仓库]。它是有组织的、可共享的、统一管理的大量数据的集合,这些数据长期存储在计算机中。 [En] Databas…

    数据库 2023年5月24日
    066
  • JVM详解

    一、JVM的位置及体系结构 JVM作用在操作系统之上,而Java程序作用在jvm之上,其他的程序则与jvm并列 二、类加载器,及双亲委派机制 1.类加载器 作用:加载Class文件…

    数据库 2023年6月16日
    083
  • java中如何将函数作为参数传递呢?

    函数简介: 函数(function)的定义通常分为传统定义和近代定义,函数的两个定义本质是相同的,只是叙述概念的出发点不同,传统定义是从运动变化的观点出发,而近代定义是从集合、映射…

    数据库 2023年6月11日
    092
  • MySQL语句与正则表达式

    正则表达式的作用是匹配文本,将一个模式(正则表达式)与一个文本串进行比较。MySQL用WHERE子句对正则表达式提供了初步的支持,允许你指定正则表达式,过滤SELECT检索出的数据…

    数据库 2023年6月16日
    098
  • 2022-8-26 jq简单了解

    Query 是一个 JavaScript 函数库。 jQuery 是一个轻量级的”写的少,做的多”的 JavaScript 库。jQuery 库包含以下功能…

    数据库 2023年6月14日
    0125
  • MySQL专题1: 字段和索引

    MySQL中存在 float, double 等非标准数据类型, 也有 decimal 这种标准数据类型 其区别在于: float, double等非标准类型在DB中保存的是近似值…

    数据库 2023年5月24日
    093
  • MySQL–SELECT检索语句

    1、检索单个列 SELECT prod_name FROM products; –上述语句利用 SELECT语句从 products表中检索一个名为prod_name的列。 Vi…

    数据库 2023年6月16日
    096
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球