Java对象的hashcode

在 Java 中,hashcode 和 equals 方法是 Object 类的两个重要方法,它们在处理对象比较和哈希集合(如 HashMapHashSet)时起着关键作用。对于equals大部分Java程序员都不陌生,它通常是比较两个对象的内容(值)是否相等(==双等于比较对象的内存地址),如果是Object中的equals方法默认就是比较内存地址(在没有被重写的情况下和==一样)。

hashCode 方法返回对象的哈希值。哈希码是一个整数值,主要用于在哈希表(如 HashMapHashSet)中快速定位对象。hashcode的值默认由JVM使用随机数生成的。

使用哈希码值的目的是为了判断元素是否存在哈希表中,如果使用equals来查询效率会很低。如果哈希表中没有这个对象对应的hashcode值,那么就可以确定这个对象在哈希表中不存在,存入到哈希表中;如果存在相同的hashcode值,就调用equals方法与新的元素进行比较,相同就直接覆盖,不相同就散列到其他的地址。

  • 默认实现Object 类中的 hashCode 方法基于对象的内存地址生成哈希码。
  • 重写原则:当重写 equals 方法时,通常也需要重写 hashCode 方法。这是因为在哈希集合中,首先会根据对象的哈希码值来确定对象所在的桶(bucket),然后再使用 equals 方法来确定桶内的具体位置。如果两个对象通过 equals 方法比较相等,但它们的 hashCode 方法返回不同的值,那么在哈希集合中这两个对象可能会被存储在不同的位置,导致哈希集合无法正确工作。

重写 hashCode 方法的一般原则是:

  • 如果两个对象通过 equals 方法比较相等,那么它们的 hashCode 方法必须返回相同的值。
  • 如果两个对象通过 equals 方法比较不相等,它们的 hashCode 方法返回的值不一定不同,但尽量使不同对象的哈希码值分散,以提高哈希表的性能。

简而言之,两个对象equals相等,那么hashcode一定相等;两个对象equals不相等,hashcode可有可能相等,这个就称为哈希冲突。解决哈希冲突通常使用线性探测或者二次探测,这里就不具体展开了。

public class Person {private String name;private int age;public Person(String name, int age) {this.name = name;this.age = age;}@Overridepublic int hashCode() {return Objects.hash(name, age);}@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;Person person = (Person) o;return age == person.age &&Objects.equals(name, person.name);}
}

在上述 Person 类的例子中,hashCode 方法使用 Objects.hash 方法根据 name 和 age 字段生成哈希码,确保了相等的 Person 对象具有相同的哈希码。这样在使用哈希集合存储 Person 对象时,能保证数据的一致性和高效访问。

需要注意的是,当我们重写equals() 方法,就一定要重写hashCode()方法,因为如果我们只重写equals方法,就有可能导致hashcode不相同,这样就会导致这个类无法和所有的集合类一起工作。

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

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

相关文章

Ubuntu22.04通过DKMS包安装Intel WiFi系列适配器(网卡驱动)

下载驱动包 访问 backport-iwlwifi-dkmshttps://launchpad.net/ubuntu/source/backport-iwlwifi-dkms 网站,找到适用于Ubuntu 22.04的update版本(如backport-iwlwifi-dkms_xxxx_all.deb),下载至本地。 安装驱动 在下载目录中执行以…

深度学习--概率

1 基本概率论 1.1 假设我们掷骰子,想知道1而不是看到另一个数字的概率,如果骰子是公司,那么所有6个结果(1..6),都有相同的可能发生,因此,我们可以说1发生的概率为1/6. 然而现实生活中,对于我们从工厂收到的…

kaggle上经典泰坦尼克项目数据分析探索

之前了解在kaggle上这个项目很火,最近想要加强一下python数据分析,所以在kaggle上找到这个项目进行学习探索,下面是将一些学习资料以及过程整理出来。 一、首先我们了解一下项目背景以及如何找到这个项目。 kaggle项目地址: https://www.k…

《深度剖析:鸿蒙系统不同终端设备的UI自适应布局策略》

在万物互联的时代,鸿蒙系统以其独特的分布式理念和强大的技术架构,迅速在智能终端领域崭露头角。随着鸿蒙生态的不断壮大,越来越多的开发者投身其中,致力于为用户打造丰富多样的应用体验。然而,如何让应用在不同终端设…

计算机网络的软件、硬件和组成

1.计算机网络的组成 计算机网络是一个十分复杂的系统,在逻辑上可以分为完成数据通信的通信子网和进行数据处理的资源子网两个部分。 通信子网 通信子网提供网络通信的功能,可以完成网络主机之间的数据传输、交换、通信控制和信号变换等通信…

告别低效人工统计!自动计算计划进度

实时监控任务进度一直是项目管理中的一项巨大挑战。 人工统计方式不仅耗时耗力,而且往往由于信息传递的延迟和人为误差,导致无法实时获得准确的项目进展信息。 这种不准确性可能掩盖潜在的风险点,从而影响项目的整体进度和成果。 Ganttable …

楼宇自控系统的结构密码:总线与分布式结构方式的差异与应用

在现代建筑中,为了实现高效、智能的管理,楼宇自控系统变得越来越重要。它就像建筑的 智能管家,可自动控制照明、空调、通风等各种机电设备,让建筑运行更顺畅,还能节省能源成本。而在楼宇自控系统里,有两种关…

OpenWrt开发第4篇:设置开发板的IP-基于Raspberry Pi 4B开发板

文/指尖动听知识库-谷谷 文章为付费内容,商业行为,禁止私自转载及抄袭,违者必究!!! 文章专栏:Openwrt开发-基于Raspberry Pi 4B开发板 有时候开发过程中经常会使用其他路由器,很多时候固件烧上去之后板子IP基本都是192.168.1.1,这时就需要修改板子的IP,下面介绍一下板…

Node.js系列(4)--微服务架构实践

Node.js微服务架构实践 🔄 引言 微服务架构已成为构建大规模Node.js应用的主流选择。本文将深入探讨Node.js微服务架构的设计与实现,包括服务拆分、服务治理、通信机制等方面,帮助开发者构建可扩展的微服务系统。 微服务架构概述 Node.js…

Docker逃逸

判断是否再docker中 1.ls -a / (查看c根目录查看是否有docker配置文件) 2.查看进程 如果在要逃逸到真实环境中: 特权模式进行docker逃逸:管理员执行eddocker run--privileg,如何判断是否是特权模式() 特权模式以…

Vite管理的Vue3项目中monaco editer的使用以及组件封装

文章目录 背景环境说明安装流程以及组件封装引入依赖封装组件 外部使用实现效果 v-model实现原理 背景 做oj系统的时候,需要使用代码编辑器,决定使用Monaco Editor,但是因为自身能力问题,读不懂官网文档,最终结合ai和网友的帖子成功引入&…

pdf文件分页按需查看

pdf预览本来打算粗暴点,一次性查看全部,但是一个pdf四五百页导致手机端查看超出内存直接崩掉,崩掉会导致页面疯狂刷新,所以不得不进行优化 解决思路大致如下: canvas转为blob格式以图片的形式加载在页面(B…

算力100问☞第92问:为什么各地热衷建设算力中心?

目录 1、宏观分析 2、政府角度分析 3、投资者角度分析 在数字化浪潮中,各地对算力中心建设的热情高涨,这一现象背后潜藏着诸多深层次的原因,涵盖了经济、科技、社会等多个维度,且彼此交织,共同驱动着这一发展趋势。 1、宏观分析 从经济结构转型的底层逻辑来看,全球经…

Redis 内存管理

Redis 内存管理 1. Redis 给缓存数据设置过期时间的作用 给缓存数据设置过期时间(TTL, Time-To-Live)有以下几个重要作用: (1) 自动释放内存 避免缓存数据无限增长,导致 Redis 内存溢出。例如,在 会话管理、短连接…

PyCharm中使用pip安装PyTorch(从0开始仅需两步)

无需 anaconda,只使用 pip 也可以在 PyCharm 集成环境中配置深度学习 PyTorch。 本文全部信息及示范来自 PyTorch 官网。 以防你是super小白: PyCharm 中的命令是在 Python Console 中运行,界面左下角竖排图标第一个。 1. 安装前置包 numpy …

掌握新编程语言的秘诀:利用 AI 快速上手 Python、Go、Java 和 Rust

网罗开发 (小红书、快手、视频号同名) 大家好,我是 展菲,目前在上市企业从事人工智能项目研发管理工作,平时热衷于分享各种编程领域的软硬技能知识以及前沿技术,包括iOS、前端、Harmony OS、Java、Python等…

如何理解java中Stream流?

在Java中,Stream 是 Java 8 引入的一个强大API,用于处理集合(如 List、Set、Map 等)数据的流式操作。它提供了一种声明式、函数式的编程风格,可以高效地进行过滤、映射、排序、聚合等操作。 Stream 的核心概念 流&…

【Vitis AIE】FPGA快速部署ConvNet 示例MNIST数据集

AIE-ML 上的 MNIST ConvNet 版本:Vitis 2024.2 简介 本教程在 AMD VersalTM 自适应 SoC AIE-ML 上实现了一个卷积神经网络分类器,用于识别来自 MNIST 数据库 的手写数字。目标是说明如何将一个简单的机器学习示例分区和向量化到 Versal AI 引擎。MNIS…

ubuntu桌面图标异常——主目录下的所有文件(如文档、下载等)全部显示在桌面

ubuntu桌面图标异常 问题现象问题根源系统级解决方案方法一:全局修改(推荐多用户环境)方法二:单用户修改(推荐个人环境)操作验证与调试避坑指南扩展知识参考文档问题现象 主目录文件异常显示 用户主目录(如/home/user/)下的所有文件(如文档、下载等)全部显示在桌面,…

OceanBase 4.3.3 AP 解析:应用 RoaringBitmaps 类型处理海量数据的判重和基数统计

对于大数据开发人员而言,处理海量数据的判重操作和基数统计是常见需求,而 RoaringBitmap类型及其相关函数是当前非常高效的一种解决方案,许多大数据库产品已支持RoaringBitmap类型。OceanBase 4.3.3版本,作为专为OLAP场景设计的正…