当前位置: 首页 > news >正文

【Java】HashCode方法重写注意事项

HashCode方法

  1. HashCode方法是属于Object父类提供的方法,HashCode方法返回该对象的哈希码值。支持该方法是为哈希表提供一些优点,例如,java.util.Hashtable提供的哈希表
  2. HashCode的常规协定是:在Java应用程序执行期间,在同一个对象上多次调用hashCode方法时,必须一致地返回相同的整数。
  3. HashCode的存在主要是用于查找的快捷性,如Hashtable,HashMap等,HashCode是用来在散列存储结构中确定对象的存储地址的
  4. 如果equals方法比较相等,则HashCode值也一定相等,但是HashCode值相等不代表equals比较也相等
  5. 如果类中重写了 equals 方法 必须要重写 HashCode 方法

【强制】关于 hashCode 和 equals的处理,遵循如下规则:

  • 只要重写 equals,就必须重写 hashCode
  • 因为Set 存储的是不重复的对象,依据 hashCode和equals 进行判断,所以 Set存储的对象必须重写这两个方法
  • 如果自定义对象作为 Map 的键,那么必须覆写 hashCode 和equals

   说明:String 因为重写了hashCode 和 equals 方法,所以我们可以愉快地使用 String 对象作为  Key 来使用

示例代码

package com.collection.Demo10;import java.util.Objects;public class MayktEntity {private String name;private Integer age;public MayktEntity(String name, Integer age) {this.name = name;this.age = age;}@Overridepublic boolean equals(Object o) {//先判断两个对象内存地址是否相同if (this == o) return true;//如果第二的对象为null或者 两个类型不相等  返回falseif (o == null || getClass() != o.getClass()) return false;//比较两个对象的成员属性值是否相等MayktEntity that = (MayktEntity) o;
//        return (this.name.equals(that.name)) && (this.age.equals(that.age));//等价与下一行return Objects.equals(name, that.name) && Objects.equals(age, that.age);}/*** public static boolean equals(Object a, Object b) {* return (a == b) || (a != null && a.equals(b));* }* <p>* public boolean equals(Object obj) {* return (this == obj);* }*/@Overridepublic int hashCode() {return Objects.hash(name, age);
//        return this.name.hashCode() + this.age.hashCode();//这行是将两个hash值相加,可以看到两个对象的hash是否相等,//但与上面一行不等价}
}
package com.collection.Demo10;public class Test02 {public static void main(String[] args) {/*** equals作用:equals就是在比较两个对象的值是否相等(误区)* equals属于Object父类中 默认的情况下 在比较两个对象的内存地址是否相同* 如果想要能够实现比较两个对象中成员属性值是否相等 需要重写父类中的equals()*/String str1 = "mayikt";String str2 = "mayikt";System.out.println(str1 == str2);//trueSystem.out.println(str1.equals(str2));//true 问题:这里的equals为什么是为true?//∵ String类中 重写父类中的equals() 比较两个字符串值是否相同MayktEntity maykt1 = new MayktEntity("mayikt", 22);MayktEntity maykt2 = new MayktEntity("mayikt", 22);System.out.println(maykt1.equals(maykt2));//false  这里实际上 等价与mayikt1==mayikt2 比较两个对象的内存地址是否相同//如果上面在MayiktEntity中重写了equals(),maykt1.equals(maykt2) 结果为 trueSystem.out.println(maykt1 == maykt2);//false//如果只重写equals,不重写hashCode() 两个值是不一样的System.out.println(maykt1.hashCode());//1163157884 重写后:845662570System.out.println(maykt2.hashCode());//1956725890 重写后:845662570}
}

package com.collection.Demo10;public class Test03 {public static void main(String[] args) {/*** HashCode?* hashCode 属于 object父类中 Java虚拟机提供 给每个对象生成一个 hashCode值 整数类型(int)* hashCode值生成规则:堆内存地址转化成整数类型*/String str1 = "mayikt1";String str2 = "mayikt2";String str3 = "mayikt2";System.out.println(str1.equals(str2));//falseSystem.out.println(str1.hashCode());//845661636System.out.println(str2.hashCode());//845661637System.out.println(str3.hashCode());//845661637Object o = new Object();System.out.println(o.hashCode());//1163157884/*** 1.如果使用equals方法比较两个对象相等,则HashCode值一定相等* 2.但是两个对象的HashCode值相等 不代表使用equals比较也相等* 3.如果两个对象的HashCode值相等,但是值是不同的 专业术语:Hash冲突问题* HashMap集合底层源码 根据该对象的HashCode值计算存放到数组中index位置*/String strA = "a";Integer int97 = 97;//这里只可以用Integer 引用类型,int类型 不可以使用hashCode//整数类型 包装类Integer hashCode值是多少呢?——就是该整数类型值 97System.out.println(strA.hashCode());//97System.out.println(int97.hashCode());//97System.out.println(strA.equals(int97));//false}/*** MD5 加密底层算法——hash算法* 相同的内容 做MD5 得到md5值是一样的*/
}

下一篇文章:HashMap常见的面试题

相关文章:

【Java】HashCode方法重写注意事项

HashCode方法 HashCode方法是属于Object父类提供的方法&#xff0c;HashCode方法返回该对象的哈希码值。支持该方法是为哈希表提供一些优点&#xff0c;例如&#xff0c;java.util.Hashtable提供的哈希表HashCode的常规协定是&#xff1a;在Java应用程序执行期间&#xff0c;在…...

039-第三代软件开发-PDF阅读器

第三代软件开发-PDF阅读器 文章目录 第三代软件开发-PDF阅读器项目介绍PDF阅读器1 初始化PDF view2 qml 中使用3 创建模块 关键字&#xff1a; Qt、 Qml、 pdf、 LTDev、 本地 项目介绍 欢迎来到我们的 QML & C 项目&#xff01;这个项目结合了 QML&#xff08;Qt Met…...

计算机毕业设计选题推荐-跑腿平台微信小程序/安卓APP-项目实战

✨作者主页&#xff1a;IT研究室✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…...

RocketMQ生产者消息发送出去了,消费者一直接收不到怎么办?(Rocket MQ订阅关系一致性)

问题: 使用RocketMQ消息队列&#xff0c;生产者将数据发送出去了&#xff0c;但是生产者一致没接收到&#xff08;或者是间隔好几分钟&#xff0c;突然接收到一条数据&#xff09;怎么办&#xff1f;并且通过rocket web控制台查看消息的状态为NOT_ONELINE或者NOT_CONSUME&#…...

使用Golang开发硬件驱动

1. 介绍 Golang是一种简洁、高效的编程语言&#xff0c;它的强大并发性能和丰富的标准库使得它成为了开发硬件驱动的理想选择。在本文中&#xff0c;我们将探讨如何使用Golang开发硬件驱动程序&#xff0c;并提供一个实例来帮助你入门。 2. 准备工作 在开始之前&#xff0c;…...

设计模式(19)命令模式

一、介绍&#xff1a; 1、定义&#xff1a;命令模式&#xff08;Command Pattern&#xff09;是一种行为设计模式&#xff0c;它将请求封装为一个对象&#xff0c;从而使你可以使用不同的请求对客户端进行参数化。命令模式还支持请求的排队、记录日志、撤销操作等功能。 2、组…...

QModelIndex 与QStandardItem相互转换

目录 1、 QModelIndex 转换成QStandardItem 2 、QStandardItem 转换成 QModelIndex 3、示例 4、总结 1、 QModelIndex 转换成QStandardItem QStandardItem * itemQStandardItemModel::​itemFromIndex(const QModelIndex & index) const 借助QStandardItemModel来完成…...

Linux - 进程地址空间

前言 首先&#xff0c;我们先要对 内存当中存储 各个数据之间的 结构要有一个 大概的了解&#xff1a; 各个区当中存储的数据使用类型不同&#xff0c;所以&#xff0c;这些数据在使用方式上是有差别的。比如下面这个例子&#xff1a; 在C 语言当中我们不能直接对 上述的 str…...

系统架构设计师-第16章-嵌入式系统架构设计理论与实践-软考学习笔记

嵌入式系统( Embedded System) 是为了特定应用而专门构建的计算机系统&#xff0c;其架构是随着嵌入式系统的逐步应用而发展形成的。嵌入式软件架构的设计与嵌入式系统的体系架构是密不可分的。因此&#xff0c;本常首先介绍嵌入式系统硬件相关知识&#xff08;系统特征、硬件组…...

pod进阶

目录 资源限制 CPU 资源单位 内存 资源单位 实例 健康检查 探针的三种规则&#xff1a; Probe支持三种检查方法&#xff1a; 示例1&#xff1a;exec方式 示例2&#xff1a;httpGet方式 示例3&#xff1a;tcpSocket方式 示例4&#xff1a;就绪检测 扩展 资源限制 当定…...

系列四十七、Spring的事务传播行为案例演示(七)#NOT_SUPPORTED

一、演示Spring的传播行为&#xff08;NOT_SUPPORTED&#xff09; 1.1、StockServiceImplNOT_SUPPORTED /*** Author : 一叶浮萍归大海* Date: 2023/10/30 15:43* Description: 演示NOT_SUPPORTED的传播行为* 外部不存在事务&#xff1a;不开启新的事务* 外部存在…...

54.RabbitMQ快速实战以及核心概念详解

MQ MQ&#xff1a;MessageQueue&#xff0c;消息队列。这东西分两个部分来理解&#xff1a; 队列&#xff0c;是一种FIFO 先进先出的数据结构。 消息&#xff1a;在不同应用程序之间传递的数据。将消息以队列的形式存储起来&#xff0c;并且在不同的应用程序之间进行传递&am…...

Qt TreeView 设置节点不可编辑

目录 1. 创建treeview 2、节点不可编辑 3、设置logo 4、实例代码 1. 创建treeview //声明模型 QStandardItemModel *model;//创建4行&#xff0c;1列的模型 model new QStandardItemModel(4,1);//添加标题 model->setHeaderData(0, Qt::Horizontal, tr("Tree View…...

python django获取某个角色的某个数据和——例如:获取所有订单的应付金额总和

model关系如下&#xff1a; class Order(models.Model):订单product models.ForeignKey(Product, on_deletemodels.SET_NULL, blankTrue, nullTrue, verbose_name"产品")no models.CharField(max_length50, blankTrue, nullTrue, verbose_name订单编号, db_indexT…...

如何在React项目中引用less

安装less npm install less less-loader --save-dev暴露 webpack 文件 利用 npx create-react-app 搭建的 React 项目&#xff0c;默认隐藏 webpack 配置文件&#xff0c;引入 less 需要修改 webpack 配置文件&#xff0c;因此我们需要执行命令暴露 webpack 配置文件。 请先将…...

NUXT前端服务端渲染技术框架

服务端渲染又称SSR&#xff08;Server Side Render&#xff09;实在服务端完成页面的内容&#xff0c;而不是在客户端通过AJAX获取数据 优势&#xff1a;更好的SEO&#xff0c;由于搜索引擎爬虫抓取工具可以直接查看完全渲染的页面 Nuxt.js是一个基于Vue.js的轻量级应用框架&a…...

力扣每日一题90:子集

题目描述&#xff1a; 给你一个整数数组 nums &#xff0c;其中可能包含重复元素&#xff0c;请你返回该数组所有可能的子集&#xff08;幂集&#xff09;。 解集 不能 包含重复的子集。返回的解集中&#xff0c;子集可以按 任意顺序 排列。 示例 1&#xff1a; 输入&#x…...

「linux基础」上传代码到github/gitee

一、在gitee创建一个仓库 1.创建仓库 2.获取仓库地址 二、克隆仓库文件到linux中 1.查看Linux中是否安装git&#xff1a;git --version 如果没有&#xff0c;在root下使用指令 yum install -y git 安装。 2.使用 git clone 仓库地址&#xff0c;克隆仓库文件到linux中 三、第…...

Hafnium总体考虑

安全之安全(security)博客目录导读 目录 一、安全世界构建平台 二、安全分区调度 三、平台拓扑...

C#__对Json文件的解析和序列化

Json: 存储和交换文本信息的语法。&#xff08;类似XML&#xff0c;语法独立&#xff09; 一种轻量级的数据交换格式。&#xff08;更小&#xff0c;更快&#xff0c;更易解析&#xff09; 语法规则: 数据在键值对里面&#xff0c;数据由逗号分隔开。 …...

AI助手开发实战:从资源索引到生产级系统搭建指南

1. 项目概述&#xff1a;一个为AI助手开发者准备的“藏宝图” 如果你正在开发一个AI助手应用&#xff0c;或者正打算将大语言模型的能力集成到你的产品里&#xff0c;那你大概率会遇到一个经典难题&#xff1a;面对市面上眼花缭乱的模型、API和工具&#xff0c;我到底该怎么选&…...

【优化交叉口的绿灯时间】基于遗传算法的交通灯管理研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…...

Onekey:重构Steam Depot清单下载流程的现代化解决方案

Onekey&#xff1a;重构Steam Depot清单下载流程的现代化解决方案 【免费下载链接】Onekey Onekey Steam Depot Manifest Downloader 项目地址: https://gitcode.com/gh_mirrors/one/Onekey Onekey作为一款专为Steam Depot清单设计的自动化下载工具&#xff0c;通过其创…...

虚实实景双向映射,升级高端楼宇精细化透明治理

虚实实景双向映射&#xff0c;升级高端楼宇精细化透明治理副标题&#xff1a;原生引擎驱动动态三维场景重构&#xff0c;结合无感化坐标解算、遮挡自适应跨镜接续、身体指纹无源身份匹配&#xff0c;构筑难以复刻、适配极强的楼宇透明化技术壁垒一、方案总览当下高端楼宇运营治…...

Arm CoreLink PCK-600电源管理架构与寄存器编程详解

1. Arm CoreLink PCK-600电源控制架构解析在嵌入式系统设计中&#xff0c;电源管理单元&#xff08;PMU&#xff09;是实现高效能耗控制的核心组件。Arm CoreLink PCK-600作为业界领先的电源控制解决方案&#xff0c;其架构设计体现了现代SoC电源管理的先进理念。PCK-600系列采…...

Windows鼠标指针主题定制:从.cur/.ani文件到个性化交互体验

1. 项目概述&#xff1a;一个为Windows终端注入灵魂的鼠标指针主题如果你和我一样&#xff0c;每天有超过8小时的时间是与Windows操作系统相伴的&#xff0c;那么你对那个千篇一律的白色箭头鼠标指针&#xff0c;恐怕早已感到审美疲劳。它就像一个沉默的、功能性的背景板&#…...

基于GitHub Actions的自动化代码质量守护:CodeBuddy实战指南

1. 项目概述与核心价值最近在和一些团队做代码评审和协作时&#xff0c;我经常遇到一个痛点&#xff1a;大家写的代码风格各异&#xff0c;注释要么缺失要么过时&#xff0c;一些潜在的安全漏洞和性能问题在提交前很难被系统性地发现。虽然市面上有各种静态分析工具&#xff0c…...

氛围驱动开发:数据化提升开发者效率与团队协作的实践指南

1. 项目概述&#xff1a;当开发节奏遇上“氛围感”最近在GitHub上看到一个挺有意思的项目&#xff0c;叫“vibe-driven-dev”。光看名字&#xff0c;你可能会有点摸不着头脑——“氛围驱动开发”&#xff1f;这听起来不像是一个传统的技术框架或工具库。没错&#xff0c;它确实…...

深度解析VS Code Live Server:高效前端开发实时预览配置秘籍

深度解析VS Code Live Server&#xff1a;高效前端开发实时预览配置秘籍 【免费下载链接】vscode-live-server Launch a development local Server with live reload feature for static & dynamic pages. 项目地址: https://gitcode.com/gh_mirrors/vs/vscode-live-serv…...

基于Rust的网页正文提取工具web-reader:从原理到自动化实践

1. 项目概述&#xff1a;一个为现代阅读场景而生的开源利器最近在折腾个人知识库和稍后读工具链&#xff0c;发现市面上的网页内容抓取工具要么太重&#xff0c;要么太“脏”——抓下来的内容常常带着一堆广告、导航栏&#xff0c;甚至还有烦人的弹窗代码。直到我遇到了Cat-tj/…...