为什么重写equals方法必须重写hashcode_equals

为什么重写equals方法必须重写hashcode_equals重写 equals 方法要重写 hashCode 这是 Java 规范。作者从 hash 原理来说起为什么要有这样的规范。

首先,这是 Java 规范。为什么要有这样的规范呢?还得从 hash 原理说起。

举个例子。现在有 1000 个字符串,都是人名,比如 Jack、Tom 等。最简单的存储方式是,将这 1000 个字符串存入一个数组里。假如 Jack 存在于 311 这个位置。如果我现在要找到它,必须得和 数组里的的数据逐个比较,从下标为1的位置开始比较,然后和下标为2的位置比较,直到比较到 311 这个位置的数据。

那么,有没有更高效的方式呢?有。很多。hash 就是最典型的一种。说 hash 之前,要提到数组的一个特点了。在一个数组里,假如我知道某个数据(比如Jack)存放的位置(下标 311),我就可以一步就取出这个数据(Jack)。试想,将 Jack 和数组下标 311 通过某种方式关联起来。那么查找效率是不是会变得高效?我们先尝试着关联一下看看。

比如,如果将 a-z 和 1-26 这些数字映射起来。那么Jack就是 J=10,a=1,c=3,k=11.那么 Jack = 101311 和 1000 取模为 311。那么我通过这种方式,将 Jack 存在下标为 311 的单元格中。等到取数据的时候,比如有个场景,查询数组里有没有 Jack 这个字符串。那么我可以用 Jack 经过同样的计算方式,得到一个值为 311 。然后在数组里,获取到下标为 311 这个单元格里面的数据。这样,查找效率就比一个一个顺着往下比较高很多倍。

为什么重写equals方法必须重写hashcode_equals


hash桶实际是一个数组

hash碰撞的缘故,可能一个单元格里存有多个数据,比如 311这个格子里不仅有Jack, 还有 Tom ,所以需要 equals 来进行字符串匹配了。

这里,可以看出 hashCode 和 equals 方法分别做了什么。某个数据,通过算法,得到 hashCode,然后将这个数据存入下标等于 hashCode 的单元格里。这样,就将数据和数组下标关联起来了。因为hash碰撞,一个单元格可能存有多个数据, equals 就是为了比较一个单元格里是否有目标数据。

所以,重写 equals 需要重写 hashCode。

总之,hash算法是利用数组寻下标访问速度高效的特点。将存储的元素和数组下标关联起来。来达到高查找效率的目标。

Java 中,当用到HashMap,HashSet这类的集合框架时,比如,将自己新建的类作为 HashMap 的 key。这种情况下,需要重写hashCode和equals方法。重写的情景很少,但是掌握了hash原理,也就能搞明白数据库的hash索引、一致性hash等等。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/13805.html

(0)

相关推荐

  • Elasticsearch 7.x 最详细安装及配置

    Elasticsearch 7.x 最详细安装及配置Elasticsearch7.x最详细安装及配置一、Elasticsearch7.x小马哥说过,学习技术栈得看版本,那么Elasticsearch7.x有什么好的特性呢?ES7.0是2019年4月份发

    2023-08-19
    117
  • 使用PyCharm编写Python程序

    使用PyCharm编写Python程序Python是一种高级语言,因其简单易学、可读性强、跨平台、强大的库等特点在各个领域应用广泛。而PyCharm是一个功能强大的Python IDE,提供了丰富的工具和环境,方便快捷地编写、调试和测试Python程序。本文将会详细介绍如何使用PyCharm编写Python程序,并让读者更深入的了解这个强大而又易用的工具。

    2024-08-08
    31
  • 字节跳动基于 Apache Hudi 的多流拼接实践方案

    字节跳动基于 Apache Hudi 的多流拼接实践方案字节跳动数据湖团队在实时数仓构建宽表的业务场景中,探索实践出的一种基于 Hudi Payload 的合并机制提出的全新解决方案。 字节跳动数据湖团队在实时数仓构建宽表的业务场景中,探索实践出的一种基于

    2023-05-10
    146
  • mysql的ddl和dml_sql基本语句大全

    mysql的ddl和dml_sql基本语句大全DDL:数据定义语言 注意:对表操作的时候需要进入到对应的数据库里面去。 创建表:CREATE TABLE [IF NOT EXISTS] 'tbl_name' ( 字段1 修饰符,

    2023-06-04
    144
  • 报表有 100 多万条数据,展现太慢了怎么办?「建议收藏」

    报表有 100 多万条数据,展现太慢了怎么办?「建议收藏」报表要展现 100 多万数据得用分页方式查询了,如果是自己写代码开发的报表就再实现一下分页查询就可以,不同的数据库实现机制不一样,具体网上资料很多。 如果是用报表工具开发的报表,要看工具本身是否支持…

    2023-03-12
    137
  • n阶魔方块数_n阶魔方阵

    n阶魔方块数_n阶魔方阵相信很多同学都玩过魔方,那么你知道如何开发一个魔方的游戏么?今天这篇文章为大家带来使用 Oasis 快速实现 N 阶魔方的总结分享,感谢蚂蚁集团工程师箕宿的投稿和分享,也欢迎广大读者的交流反馈~

    2023-08-14
    129
  • 搭建一个ubuntu系统的前端开发环境[亲测有效]

    搭建一个ubuntu系统的前端开发环境[亲测有效]引言:最近在公司一直用自己的Mac book进行开发工作,公司的windows主机不知怎么的无法运行 eggjs框架的web项目(简单的demo项目可以运行,但目前正在开发的项目无法运行)很是无奈,索性将主机直接安装ubuntu系统,差不多和Windows系统说88了。 大家去…

    2023-08-07
    131
  • NO.5 MySQL-笔记「终于解决」

    NO.5 MySQL-笔记「终于解决」第一章 (p1-p10) 1、安装环境 1、配置环境变量到/bin 2、创建my.ini.txt目录 输入内容:(直接复制) 【 client 】 port=3306 default-characte

    2023-06-02
    142

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注