Java—hashCode、equals

news2024/9/20 22:24:47

文章目录

  • hashCode()
    • 介绍hashCode()
    • hashCode方法作用
    • 为什么要有hashCode()?
  • equals()
    • equals()作用?
    • 为什么重写equals方法必须重写hashcode方法?
    • 128陷阱?
  • equals和hashCode的关系

———————————————————————————

hashCode()

介绍hashCode()

hashCode()定义在JDK的Object中,这就意味着Java中的任何类都包含有hashCode()方法。hashCode()的作用是获取哈希码,也称为散列码;它实际上是返回一个int整数,作用是确定该对象在哈希表中的索引位置。

散列表存储的是键值对(key-value),它的特点是:能根据"键"快速的检索出对应的"值”。(可以快速找到所需要的对象)

hashCode方法作用

作用:获取哈希值,哈希值的计算利用的是对象在堆中开辟空间的内存地址

为什么要有hashCode()?

以"HashSet如何检查重复"为例子说明为什么要有hashCode:

当把对象加入HashSet中时,HashSet会先计算对象的hashcode值来判断对象加入的位置,同时也会跟其他已经加入的对象的hashcode值作一个比较,如果没有相等的hashcode值,HashSet会假设对象没有重复出现。但是如果发现有相同hashcode值的对象,就会调用equals()方法来检查hashcode值相等的对象是否真的相同。如果两个对象相同,HashSet就不会让它加入。如果不同的话,就会把它重新散列到其他位置。这样我们就大大减少了 equals的次数,相应就大大提高了执行速度。

equals()

Object类的equals方法,底层是使用“==”来实现,

  • 如果比较的两个变量是基本类型,就是在比较其值是否相等。
  • 如果比较的两个变量是引用类型,就是在比较其地址是否相等。

注:其实基本类型不用equals方法
在这里插入图片描述

  • this代表当前对象,谁调用这个方法,this代表谁

比较的时候java会重写equals方法,因为使用equals方法会新申请空间,所以地址肯定不同
例:
以下返回肯定是false,因为地址不同
在这里插入图片描述
——>所以使用equals:
重写后的equals方法源码:
在这里插入图片描述
注:980行的判断条件 + 981行的String anotherString = (String)anObject;-------判断父类类型是不是子类的,是子类的才能强转为子类

equals()作用?

(1)equals()方法用来对两个变量的值进行比较。

equals()只能针对引用数据类型;equals()来源于Object类(object类是所有类的父类),object类当中的equals() 是用 == 比较的地址是否相等;String 类当中的equals()是对Object类当中的equals()的重写;String 类当中的equals(),首先进行的是地址比较,当两个字符串的地址不同时,在进行值的比较。包装类当中的equals(),对数据进行一个拆箱,用==进行值的比较。至于为什么要拆箱,其实是因为要避免128陷阱。

(2)注意事项: 如果要重写equals()方法,一定要重写hashCode()方法。

①: 0bject 中hashCode()是根据对象的存储地址转换而形成一个int类型的哈希值,equals()则进行地址判断
②: HashMap中需要hashCode()和equals()两个相结合使用,当存储数据的时候, key相同,后面的数据的会覆盖前面的数据,key需要用equals()去判断, value 的存储位置需要根据 key 的 hashCode()进行判断。

为什么重写equals方法必须重写hashcode方法?

  • 首先equals在object类里的作用是比较两个引用指向的是否是同一个对象, 也就是两个对象的地址是否相同
  • 但是我们在实际开发过程中,这种开发方式往往不满足我们的需求,比如我们有一个person类,我们的需求可能是当一个人的年龄和姓名和性别都相同时,我们就认为这是同一个人
  • 所以我们需要重写equals方法来自行决定两个对象相等的判别方式 , 但是在hashSet或者说hashMap的底层判断两个对象是否相同是需要hashcode和equals同时来决定的(hashset的底层是hashmap)
  • 所以如果我们只重写了equals但是没有重写hashcode,我们在用hashset去重的时候,其底层就会认为这是两个不同的对象,去重就会失败。

128陷阱?

两个基本类型的包装类用==进行数据比较,如果值的范围在-127~128之间,那么返回true,如果在这个范围之外,返回false;

至于为什么会出现这种情况呢?
—>对于非new出来的包装类对象,以Integer为例,Integer当中,有一个方法,将基本类型转换为Integer类型,在代码当中,一定范围内返回的数据和范围外返回的数据不同,这个范围定义的是-128127,值不在-128127之间的话,是在堆内存开辟新的内存空间存储值,Integer num3 = 200和Integer num4 = 200相当于在堆内存开辟了两块内存空间,两个内存空间都存储200这个值,而==比较的是地址,所以返回false。

equals和hashCode的关系

在这里插入图片描述

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

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

相关文章

前端环境变量及vite中本地环境配置实践

前言 前端在之前并没有工程化的概念,甚至开发环境、测试环境、生产环境全靠大家手动配置。 有了nodejs之后,环境变量 (environment variables)这个概念,便慢慢进入了前端的视野,方便了前端各种环境自动化…

Android背景和音乐

Android背景和音乐前言一、添加背景图片二、加入背景音乐前言 简单的给app添加背景图和音乐 一、添加背景图片 准备好一张合适的背景图片新建一个Empty Activity项目选择Java语言在res中创建一个mipmap文件,将准备的图片粘贴到该文件目录下 在activity_main.xml里面添加代码…

mysql高阶语句

目录 前言 一、高级sql语句 1、按关键字排序 二、区间判断 ——且/或 三、 distinct 查询不重复记录 四、对结果进行分组 五、限制结果条目——limit 六、设置别名(alias ——>as) 七、通配符 八、子查询 前言 当我们对mysql数据库进行了查…

GJB 5000B二级-QA质量保证

1、主要变化情况 修订2条,合并1条(绿色),新增1条(黄色) 新增的主要内容 将原标准过程域名称“过程和产品质量保证”改为“质量保证” 目的:评价并改进已执行的过程和所产生的工作产品的质量,确保其满足已制定的过程说明和适用的标准。 (GJB5000A:过程和产品质量保…

RISC-V SiFiveU64内核——L2 Prefetcher预期器

目录L2 Prefetcher简介操作流退出页边界Memory Map控制寄存器L2 Prefetcher 初始化L2 prefetcher是U64内核新增的功能,U54内核没有这个功能。打开L2 prefetcher功能后,当访问大片内存,同时dcache中没有缓存时,访问内存的速率可以提…

用R语言和python进行社交网络中的社区检测

在这篇文章中,我用R语言和python检测社交网络中的社区。最近我们被客户要求撰写关于社区检测的研究报告,包括一些图形和统计输出。 相关视频:复杂网络分析CNA简介与R语言对婚礼数据聚类(社区检测)和可视化|数据分享 复…

(一)LTspice简介

文章目录前言一、举例1.1、RC滤波1.2、仿真结果二、软件安装总结前言 LTspice是一款高性能SPICE仿真器软件,包括原理图捕获图形界面。可探测原理图以产生仿真结果,通过LTspice内置波形查看器轻松探索。与其他SPICE解决方案相比,LTspice的增强…

mysql之SQL练习

常见面试题 学生表:student(学号,学生姓名,出生年月,性别) 成绩表:score(学号,课程号,成绩) 课程表:course(课程号,课程名称,教师号) 教师表:teacher(教师号,教师姓名) 1查询学生总成绩排名 SELECTstu_no,sum(score_prize) AS to…

安装Hadoop下hive的问题

ji问题的主要来源,由于收到安装文档后替换了一下,出现的问题 一,配置完成后,系统变量需要重启虚拟机, bash 变量需要刷新 #系统环境变量需要重启,bash变量只要source或切换就可以 source .bash_profile 我…

VUE+Spring Boot前后端分离开发实战(六):基于RABC权限通用后台管理系统-给角色动态分配权限和用户

文章目录 前言功能设计后端实现前端实现写在后面前言 本文记录了通用后台管理系统中RABC权限中两个功能:给角色分配权限、给角色设置用户。 给角色分配用户:前端使用到了elementUI中的tree,包括加载树以及给已选配权限给默认值等。给角色设置用户:前端用到了elementUI中的…

我们需要工具支持键集分页

我们需要工具支持键集分页 (use-the-index-luke.com) 您是否知道分页非常麻烦但很容易避免?offset offset指示数据库跳过查询的前 N 个结果。但是,数据库仍必须从磁盘获取这些行并按顺序排列它们,然后才能发送以下行。 这不是实现问题&…

超好用的大数据分析平台分享,SuccBI 一站式大数据分析平台

SuccBI 一站式大数据分析平台融合了数据汇集、加工、智能调度、自助分析可视化、中国式报表等功能为企业提供一站式的大数据分析处理能力。 数据汇集、加工 连接各类分散的数据并进行加工、清洗、调度、元数据管理,帮助企业轻松汇集、管理和共享数据资产。 丰富的数…

SAR信号处理基础2——线性调频信号频谱与驻定相位原理

前面已经给出了线性调频信号的时域表达形式,并介绍了信号的实部、虚部、相位、频率等,本文介绍线性调频信号的频谱,以及推导线性调频信号时常用的驻定相位原理。计算信号的频谱,实际上就是对信号做傅里叶变换。即 驻定相位原理认…

Java高校宿舍管理系统寝室管理(含源码+论文+答辩PPT等)

项目功能简介: 本项目含代码详细讲解视频,手把手带同学们敲代码从0到1完成项目 该项目采用技术JSP、Servlet、jdbc、前端框架 bootstrap、jQuery,bootstrap-datetimepicker日期插件、Tomcat服务器、MySQL数据库 项目含有源码、配套开发软件、软件安装教程…

Linux和WIN的优势

1.性价比方面 Linux服务器与Windows服务器就性价比而言,Linux服务器优势是很明显的。Linux作为资源管理和操作系统来说,是开源、免费的,而正版的Windows的操作系统是收费的,因而就性价比来说Linux服务器优于Windows服务器。 2.性…

python的自定义函数的用法和实例

目录 1.自定义函数的语法和用法 (1)引入 (2)语法 (3)用法:用于自定义目标函数语法。 (4)调用函数 ①语法 ②解释 2.实例 (1)简单的用法 …

[附源码]计算机毕业设计小区物业管理系统Springboot程序

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

Vector - VTESTStudio(软件篇) - CAPL实现MD5算法 - 01

OTA是当前车载行业非常热门的一个话题和研究方向,然而车辆又是跟大家的生命安全息息相关的一个日常工具,因此对于车辆升级的限制条件和安全阈值是我们不可避开的一个话题,今天我们来介绍一下对于文件的校验常用的一个算法MD5。 今天我们先来说下什么是MD5算法,这个…

Java基础:Object类、常用API

第一章 Object类 1.1 概述 java.lang.Object类是Java语言中的根类,即所有类的父类。它中描述的所有方法子类都可以使用。在对象实例化的时候,最终找的父类就是Object。 如果一个类没有特别指定父类, 那么默认则继承自Object类。例如&#…

MOSFET 和 IGBT 栅极驱动器电路的基本原理学习笔记(一)MOSFET技术

MOSFET技术 1.器件类型 2.MOSFET模型 3.MOSFET关键参数 4.开关应用 5.开通过程 6.关断过程 7.功率损耗 8.寄生器件的影响 双极晶体管和 MOSFET 晶体管的工作原理相同。从根本上说,这两种晶体管都是电荷控制器件,这就意味着它们的输出电流与控制电极在半…