为什么重写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赋能HBase二级索引 | 实践一年后总结[通俗易懂]

    使用ElasticSearch赋能HBase二级索引 | 实践一年后总结[通俗易懂]前言: 还记得那是2018年的一个夏天,天气特别热,我一边擦汗一边听领导大刀阔斧的讲述自己未来的改革蓝图。会议开完了,核心思想就是:我们要搞一个数据大池子,要把公司能灌的数据都灌入这个大池子,然后让别

    2023-02-15
    98
  • 从入门到精通:Python编程实践指南

    从入门到精通:Python编程实践指南Python是一门高级编程语言,它的语法简单易懂,学习起来也比较简单,不需要太多的编程基础。Python的基础语法包括变量、数据类型、运算符、控制语句等,下面我们来具体看看。

    2023-12-18
    59
  • 03JDBC_ojdbc14和ojdbc8

    03JDBC_ojdbc14和ojdbc8JDBC JDBC是Java访问数据库的标准规范,具体操作具体由数据库厂商实现,相当于一个数据库驱动。我们只需要会JDBC接口中的方法即可,数据库驱动(jar包)由数据库厂商提供。 导入驱动jar包…

    2023-04-01
    107
  • 《推荐系统实践》pdf「建议收藏」

    《推荐系统实践》pdf「建议收藏」随着信息技术和互联网的发展,人们逐渐从信息匮乏的时代走入了信息过载(information overload)的时代 。在这个时代,无论是信息消费者还是信息生产者都遇到了很大的挑战:对于信息消费者,从大量信息中找到自己感兴趣的信息是一件非常困难的事情;对于信息生产者,让自己生产…

    2023-08-20
    71
  • 定义一个测试类测试代码_html基础代码

    定义一个测试类测试代码_html基础代码packagecom.test171.day02; import java.util.Scanner; // 功能:switch练习,成绩等级判

    2022-12-14
    118
  • 如何用ps处理照片(ps处理方式在什么地方)

    如何用ps处理照片(ps处理方式在什么地方)

    2023-09-09
    86
  • 创建Python Tkinter菜单栏

    创建Python Tkinter菜单栏Tkinter是Python自带的GUI库,它提供了一系列的图形界面控件,可以方便地创建各种GUI应用程序。Tkinter中的菜单栏是一种非常常用的控件,可以方便地为应用程序添加各种菜单及功能。

    2024-01-18
    56
  • 详解 MySql InnoDB 中意向锁的作用「终于解决」

    详解 MySql InnoDB 中意向锁的作用「终于解决」InnoDB 支持多粒度锁(multiple granularity locking),它允许行级锁与表级锁共存,而意向锁就是其中的一种表锁。 需要强调一下,意向锁是一种不与行级锁冲突表级锁,这一点非常重要。意向锁分为两种: 即:意向锁是有数据引擎自己维护的,用户无法手动操作意…

    2023-04-02
    104

发表回复

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