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

hashCode 和 equals 的处理

文章目录

  • hashCode 和 equals 的处理
  • 1. 阿里巴巴编程规范要求
  • 2. equals和hashcode的分析
    • 2.1 Object方法
    • 2.2 只覆写(Override)equals带来的问题
      • 问题演示
      • 问题分析
      • 问题处理

hashCode 和 equals 的处理

1. 阿里巴巴编程规范要求

在这里插入图片描述

2. equals和hashcode的分析

2.1 Object方法

java中,所有类都直接或间接继承自java.lang.Object类,也就是Object是java中所有类的祖先即根类

equals和hashcode是Object类提供的方法:
在这里插入图片描述

  • hashcode方法:返回的是一个对象的hash码,是由Object类本地方法生成的
  • equals方法:比较的对象的引用地址

在Java的一些集合类中,一般会重写这两个方法。 在比较两个对象是否相等时候,会根据以下规则,会先调用对象的hashCode方法得到hashCode进行比较,如果hashCode不相同,就可以直接认为这两个对象不相同,如果hashCode相同,那么就会进一步调用equals方法进行比较,而equals方法,就是用来最终确认两个对象是否相等的。

通常equals方法比较重,逻辑比较多,而hashCode方法主要就是得到一个哈希值,实际上是一个数字,相对而言比较轻,所以比较两个对象时,通常会先根据hashCode比较一下

2.2 只覆写(Override)equals带来的问题

如果只覆写(equals)而不复写hashcode,可能导致导致equals相等,而hashcode不相等,在使用HashMap进行存储时候会出现问题

问题演示

public class Person {private String name;public Person(String name) {this.name = name;}public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;Person person = (Person) o;return Objects.equals(name, person.name);}@Overridepublic String toString() {return "Person{" +"name='" + name + '\'' +'}';}
}
public class TestHashMap {public static void main(String[] args) {Map<Person, String> map = new HashMap<>();map.put(new Person("Kevin"),"Hi");System.out.println(map.get(new Person("Kevin")));}
}

执行结果:

null

问题分析

因为散列结合是使用 hashCode 来计算 key 的存储位置,如果存储两个完全相同的对象,但是有不同的 hashcode 就会导致这两个对象存储在 hash 表的不同位置,当我们想根据这个对象去获取数据的时候,就会出现一个完全相同的对象会在存储在 hash 表的两个位置。

问题处理

重写hashCode方法
重新equals方法一定要重写hashCode方法

public class Person {private String name;public Person(String name) {this.name = name;}public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;Person person = (Person) o;return Objects.equals(name, person.name);}@Overridepublic int hashCode() {return Objects.hash(name);}@Overridepublic String toString() {return "Person{" +"name='" + name + '\'' +'}';}
}

再次执行结果:

Hi
http://www.lryc.cn/news/27099.html

相关文章:

  • 17. OPenGL实现旋转移动物体
  • 《SQL基础》14. 存储过程 · 存储函数
  • NFT Insider #87:The Sandbox 收购游戏开发工作室 Sviper,GHST 大迁徙即将拉开帷幕
  • html部分codewhy网课学习笔记
  • 电脑出问题了怎么重装系统修好
  • Nginx国密支持问题记录
  • 基于ensp的小型局域网网络搭建及需求分析
  • Kubernetes学习(二)Pod
  • 【Docker】docker | 迁移docker目录
  • day24_多线程进阶
  • Qt实现系统桌面目录下文件搜索的GUI:功能一:文件查找与现实
  • 有关数据库的一级、二级、三级封锁协议
  • 【Android Studio】【学习笔记】【2023春】
  • window.open()下载文件重命名/js下载文件重命名/js跨域下载文件重命名
  • zookeeper:简介及常用命令
  • 与流程挖掘布道者熵评科技孙一鸣博士共话流程挖掘市场的起源与前景 | 爱分析访谈
  • 第十一届蓝桥杯省赛——2解密
  • ChatGPT解答:PYQT5 美化各种控件的方案和实例
  • js实现翻盘抽奖
  • Qt QtCreator 安卓开发环境搭建
  • Flutter知识点(二)处理Json
  • 基本概念简介(码率,FPS(帧数),分辨率,RTMP协议)等的介绍
  • 黑盒测试重点复习内容
  • Python每日一练(20230303)
  • 基于Cortex-M7内核STM32F767NIH6,STM32F767VGT6,STM32F767VIT6嵌入式技术资料
  • Nginx SSL证书A+之路
  • 周期性温度和压力波的PID自动控制解决方法
  • 从头开始搭建一个SpringBoot项目--SpringBoot文件的上传与下载
  • It做形式主语和宾语
  • 做测试一定要知道的——软件测试流程和测试规范标准文档