【Java面试】为什么重写equals方法必须同时重写HashCode方法?

news2024/11/26 2:43:57

众所周知再JDK1.8之后,Java修改了String类型的底层源码,因为他们发现其实对于-128~127范围的字符更加常用,因此将底层的数组从char类型修改为了byte类型。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
看到上面的方法可以发现,String类型的equals方法会先比较两个字符串的内存地址是否相等,如果是直接返回true,否则比较字符串的内容,如果内容相等返回true,否则返回false。

那么这和hashCode方法有什么关系呢?
总所周知,Java中所有的类都默认继承Object类,而Object类中有一个native的hashCode方法,因此所有的类都有一个native的hashCode方法
在这里插入图片描述
而hashCode方法在散列集合中会用到,比如HashTable、HashMap这些,当添加元素的时候,需要先判断元素是否存在,而如果直接使用equals方法去比较,那么效率非常低,此时通过的是对象的hashcode值进行取模后运算,如果table中没有这个对象相对应的hashcode的值,那么这个对象就可以存进去了,不用再进行任何比较。而如果已经存在了这个hashcode值,那么就需要进行equals方法进行对象比较,相同则覆盖,不相同直接插入。
所以这里就涉及到了一个冲突解决的问题,如果使用hashcode先判断对象是否相等,那么使用equals这个方法的次数就降低了,效率就自然提升了。

hashcode默认是JVM使用随机数生成的,两个随机对象,他们生成的hashcode值有可能相同。而如果这样子,再hash表中的提现就是所谓的hash冲突,通常使用链表或者线性探测来解决这个问题。
但是两个完全相同的对象,他们的内存地址指向同一个位置,也就是他们的hashcode一定是相同的。

那么在没有重写equals方法的情况下,x.equals(y)==true代表的就是x和y指向同一个内存地址,因为此时使用的是 == 进行判断。
那么他们的hashcode值也一定相同。
而如果重写了equals方法,但是没有重写hashCode方法,那么就会导致hashcode值可能不一样,而如果出现这种情况,就会导致这个类无法和所有的集合类一起工作。
对于散列集合,他们使用的是hashcode来判断是否是相同的,如果存储两个相同的对象,但是他们的hashcode值不同,那么就会导致这两个对象存储在hash表的两个不同的位置,然后当我们想要获取数据的时候,就会出现一个完全相同的对象,会存储在hash表的两个位置,就会破坏程序开发过程中我们约定俗成的规则,就会出现一些不可预料的错误。

所以在实际开发中,约定俗成:重写equals方法也必须重写hashCode方法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/50449.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Caffeine 源码、架构、原理(史上最全,10W字 超级长文)

文章很长,而且持续更新,建议收藏起来,慢慢读!疯狂创客圈总目录 博客园版 为您奉上珍贵的学习资源 : 免费赠送 :《尼恩Java面试宝典》 持续更新 史上最全 面试必备 2000页 面试必备 大厂必备 涨薪必备 免费赠送 经典…

软件实训-技术学习心得

一、MoOtA 前端主要负责动态界面的编写,主要学习JavaScript,HTML,CSS三件套 1、前端项目文件夹 .idea:无需关注 node_modules:无需关注 public:存放媒体资源,比如图片(images&…

CSS网页页面图像灰色滤镜写法示例

阿酷TONY / 原创 2022-12-1 / 长沙 / grayscale()函数是一个内置函数,用于对图像应用滤镜以设置图像的灰度。 用法: grayscale( amount ) 参数:此函数接受包含灰度值的单个参数量。灰度值根据数量和百分比设置。值0%表示原始图像&…

Java并发编程—Thread类中的start()方法如何启动一个线程?

一、java线程的介绍: 在java的开发过程中,很多铁子对于java线程肯定不感到陌生,作为java里面重要的组成部分,这里就从如何创建一个线程给大家进行分析; 二、相关知识引入: ​ 之前我了解过,j…

jQuery 简介

jQuery 库可以通过一行简单的标记被添加到网页中。 您需要具备的基础知识 在您开始学习 jQuery 之前,您应该对以下知识有基本的了解: HTMLCSSJavaScript 如果您需要首先学习这些科目,请在我们的 首页 查找这些教程。 什么是 jQuery &#x…

[附源码]Python计算机毕业设计Django的高校资源共享平台

项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等等。 环境需要 1.运行环境:最好是python3.7.7,…

无人机机械臂爪机器臂爪的安装调试试验。以大疆哪吒为例乐迪T8Fb遥控器。

首先将机械爪安装完毕。注意不要装的太紧,否则会损害舵机,应力度合适,可以先使用舵机测试仪测试。 安装舵机到位。要使用机械爪配套的舵机型号,否则孔位对不上。 调整螺丝孔位,确保齿轮能够吻合。 调整螺丝松紧&#…

JavaScript 基础笔记

初识 JavaScript JavaScript负责页面中的的行为,是一门运行在客户端的脚本语言。 解释型语言与编译型语言区别: JavaScript 作用 表单动态校验(密码校验)网页特效服务端开发桌面端开发等作用 JS引擎:浏览器使用Js引…

Vue3多个弹窗同时出现解决思路

Vue3多个弹窗同时出现解决思路 弹窗或者说对话框是我们在开发系统或者页面很常用的元素,所以博主想对出现多个弹窗的情况下的解决思路进行一个整理 有时候我们一个页面可能存在多个弹窗,当多个弹窗出现的时候可能屏幕就变的很黑,如下图所示…

图观引擎V3.3.4 功能更强、操作更便捷!最新升级一睹为快

图观™引擎,自去年内测版推出上线以来,已帮助众多合作伙伴开发出自己的数字孪生应用、落地交付数字孪生项目,实现了自身软件产品的全面升级、技术能力的大幅拓展。 经过不断的升级迭代,图观™引擎V3.3.4版本,更加注重…

Seata中TC服务部署及微服务集成Seata

seata的部署和集成 一、部署Seata的tc-server 1.下载 首先我们要下载seata-server包,地址在http😕/seata.io/zh-cn/blog/download.html 2.解压 在非中文目录解压缩这个zip包,其目录结构如下: 3.修改配置 修改conf目录下的re…

微服务框架 SpringCloud微服务架构 8 Gateway 网关 8.1 网关作用介绍

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式,系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 SpringCloud微服务架构 文章目录微服务框架SpringCloud微服务架构8 Gateway 网关8.1 网关作用介绍8.1.1 为什么需要网关8.1.2 网关的技术实现…

高数 | 周洋鑫 冲刺预测题自用整理复习

自用笔记整理复习。 内容来自2023周洋鑫冲刺班。 加油ヾ(◍∇◍)ノ゙ 1、函数极限计算 【加项减项】 ☆ 二次积分求极限

极值分析:分块极大值BLOCK-MAXIMA、阈值超额法、广义帕累托分布GPD拟合降雨数据时间序列...

全文链接:http://tecdat.cn/?p25348 你们可能知道,实际极值分析有两种常用方法:分块极大值Block-maxima、阈值超额法threshold excess(点击文末“阅读原文”获取完整代码数据)。今天,我们将分别介绍这两种…

【C++】vector 的使用及其模拟实现

一、vector 的使用 vector 是我们学习的第一个真正的 STL 容器,它接口的使用方式和 string 有一点点的不同,但大部分都是一样的,所以这里我们就只演示其中一些接口的使用,大家如果有疑惑的地方直接在 cplusplus 是上面查看对应的…

[附源码]计算机毕业设计springboot抗疫医疗用品销售平台

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

智引未来,利尔达成功入选首批“5G应用解决方案供应商推荐名录”名单

近日,5G应用产业方阵(5G AIA)在“2022年中国5G发展大会5G应用产业发展论坛”发布了“5G应用解决方案供应商推荐名录(第一批)”入库名单,旨在强化5G应用供需对接,推动5G应用解决方案成熟&#xf…

基于PHP+MySQL共享自行车租赁管理系统的设计与实现

随着环保意识的增加,人们的出行越来越简单便捷,其中共享自行车是现在很多年轻人最热衷的出行方式之一,本系统主要是对共享自行车的信息进行管理。该系统的基本功能包括用户登录,区域信息管理,用户信息管理,用户充值管理,车辆信息管理,租借信息管理,损耗信息管理,统计报表信息,修…

【自然语言处理概述】“海量”文件遍历

【自然语言处理概述】“海量”文件遍历 作者简介:在校大学生一枚,华为云享专家,阿里云专家博主,腾云先锋(TDP)成员,云曦智划项目总负责人,全国高等学校计算机教学与产业实践资源建设…

有关C++的异常机制

目录 为什么要有异常: 异常的抛出和捕获: 为什么要有异常: 异常在C用于错误处理,C语言中一般使用返回值表示错误,C对于错误处理进行了拓展,统一使用异常机制来处理程序中发生的错误 C的异常处理包括两个部分…