JAVA学习-hashCode() 和 equals() 的作用和在集合类中的使用建议

2023-05-16

hash

了解 hashCode() 之前最好先了解一下 hash

Java中实现hash算法icon-default.png?t=LBL2https://www.cnblogs.com/wangjiong/p/11220583.html

hashCode() 和 equals()

hashCode() 和 equals() 的作用都是用来比较两个对象是否相等,hashCode() 是通过将对象的内部地址(物理地址)转换成一个整数,然后将这个整数通过hash函数的算法返回一个 hashcode,再比较时通过比较 hashCode 来判断对象是否相等,因此在效率上,hashCode() 的效率是大于 equals() 的,但是 hashCode() 可能会发生 hash冲突,导致有时候值不同,而 hashCode 是相同的,因此在准确度上,equals() 的准确度大于 hashCode()。由此,我们可以得出两条结论:

  1. 如果两个对象通过 equals() 判读出相等,那么这两个对象的 hashCode 一定也相等。

  2. 如果两个对象的 hashCode 相等,这两个对象不一定相等。

由这两个结论,可以得出推论:如果两个对象的 hashCode 不相等,那么这两个对象一定不相等。因此在实际运用中,我们可以先用 hashCode() 去进行对比,如果 hashCode 不等,则两个对象不相等,如果 hashCode 相等,我们再调用 equals() 进行深度对比。这样既能保证效率,又能保证精准。

在集合类中的使用建议

Java 的集合类分为 List,Set,Map 三种,List 集合是有序集合,允许存在相同项;Set 集合是无序集合,不允许重复;Map 集合是键值对,键不允许重复,但是值可以允许重复。对于 Set 集合和 Map 的键这种不允许重复的,我们必须要重写 hashCode() 和 equals() 方法

举例,看以下代码:

import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

public class Demo {
	public static void main(String[] args) {
		User user1 = new User(1, "yin", "123123");
		User user2 = new User(1, "yin", "123123");
		
		Set set=new HashSet();
		set.add(user1);
		set.add(user2);
		
		Map<User, Integer> map = new HashMap<>();
		map.put(user1, 1);
		map.put(user2, 1);
		
		//判断 user1 的内容是否和 user2 的相等
		System.out.println(user1.equals(user2));
		//user1的 hashCode
		System.out.println(user1.hashCode());
		//user2的 hashCode
		System.out.println(user2.hashCode());
		//Set集合的元素个数
		System.out.println(set.size());
		//Map集合的元素个数
		System.out.println(map.size());
	}
}

该代码返回的结果是:

false
366712642
1829164700
2
2

不难看出,虽然两个 User 对象元素的值相等,但是两个 User 对象却不相等。因此,若想要俩个相等,就得重写 hashCode() 和 equals() 方法。

//用户类
public class User {
	
	//用户id
	private int user_id;
	//用户昵称
	private String user_name;
	//用户密码
	private String password;

	public User(int user_id, String user_name, String password) {
		super();
		this.user_id = user_id;
		this.user_name = user_name;
		this.password = password;
	}

	@Override
	public boolean equals(Object obj) {
		//与类本身相同
		if(obj == this) {
			return true;
		}
		//强制转换
		User user = (User) obj;
		//判断元素是否相等
		if(user_id == user.user_id && user_name.equals(user.user_name) && password.equals(user.password)) {
			return true;
		}
		return false;
	}

	@Override
	public int hashCode() {
		//按自己的方式生成一个 hashCode
		return user_id + user_name.hashCode() * password.hashCode();
	}	
}

运行结果:

true
-138521983
-138521983
1
1

参考:equals()和hashCode()方法在集合类set中的使用 - 锟斤拷锟斤拷 - 博客园 (cnblogs.com) 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JAVA学习-hashCode() 和 equals() 的作用和在集合类中的使用建议 的相关文章

随机推荐

  • Debian基础配置

    Debian的安装及基础配置 正文 debian基本介绍debian基本安装debian基本配置 结尾 本文介绍Debian的安装与基础配置 debian基本介绍 debian是一款稳定的基于Linux的操作系统 xff0c 它是由自由和开
  • OpenGL:配置glad

    GLAD库的作用 GLAD是一个开源的库 xff0c 它能解决我们上面提到的那个繁琐的问题 GLAD的配置与大多数的开源库有些许的不同 xff0c GLAD使用了一个在线服务 在这里我们能够告诉GLAD需要定义的OpenGL版本 xff0c
  • MySQL中ENGINE = InnoDB AUTO_INCREMENT = 200 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci的作用

    span class token keyword CREATE span span class token keyword TABLE span span class token punctuation 96 span permission
  • Docker数据管理,镜像创建与分层结构

    Docker数据管理 xff0c 镜像创建与分层结构 一 Docker的数据管理1 数据卷2 数据卷容器 二 容器互联 使用centos镜像 三 Docker 镜像的创建1 基于现有镜像创建2 基于本地模板创建3 基于Dockerfile
  • R语言——数据分析

    R语言 什么是数据分析 数据 数据 xff1a 是指对客观事件进行记录并可以鉴别的符号 xff0c 是对客观事物的性质 状态以及相互关系等进行记载的物理符号或这些物理符合的组合 为什么要做数据分析 我们可以通过数据分析的结果来指导决策 数据
  • CentOS 7 云服务器安装mysql5.7

    将mysql5 7的安装包上传到主机上 解压安装到 opt app 中 tar zxvf mysql 5 7 34 linux glibc2 12 x86 64 tar gz C opt app 修改目录名 mv opt app mysql
  • java求1000以内的完数及分析

    需求 一个数如果恰好等于它的因子之和 这个数就称为 完数 例如 6 61 1 43 2 43 3 编程找出 1000 以内的所有完数 分析 一千个数肯定跑不了循环的使用 xff0c 常用的循环有两个 xff0c 一个是for xff0c 一
  • 数据结构算法设计题汇总

    五 算法设计题 xff08 本题10分 xff09 34 二叉排序树的类型定义如下 xff1a typedef struct BSTNode 二叉排序树的结点结构 int data 数据域 struct BSTNode lchild rch
  • 初学node.js 对app.js的解释

    使用各种模块包 http errors模块包主要功能监视http请求过程的错误 中间件middleware xff0c 中间件本质上就是一个模块包 监听错误的中间件 var createError 61 span class token f
  • 什么是原码、反码和补码

    什么是原码 反码和补码 文章目录 什么是原码 反码和补码1 机器数2 原码3 反码4 补码5 总结 1 机器数 前言 一个数在计算机中的表示形式是二进制的话 xff0c 这个数其实就叫机器数 机器数通常是带有符号的 xff08 指有正数和负
  • ros找不到包的两种原因

    目前遇到的找不到包的两种情况是 没有设置环境变量而找不到包 解决方法1 xff0c 当前终端输入source 加包所在工作空间的devel set bash的绝对路径或相对命令行的路径 解决方法2 xff0c 打开用户目录 xff5e 的
  • Python 设计一个窗口程序,进行多种数学计算

    设计一个窗口程序 xff1a 想要实现四种功能 xff1a 1 设置按钮 x1f518 1 xff1a 点击 弹出三行输入框 输入函数表达式 显示其Latex数学表达式 输入三个函数 分别为 f 1 x f 2 x f 3 x 点击 run
  • OpenGL:如何从缓存中读取颜色、深度信息【转】

    GPU渲染完数据在显存 xff0c 回传内存的唯一方式glReadPixels函数 显存也被叫做显示内存 帧缓存 xff0c 它是用来存储显示芯片处理过或者即将读取的渲染数据 如同计算机的内存一样 xff0c 显存是用来存储图形数据的硬件
  • 字符串的练习

    字符串的练习 1 接受用户输入的字符串 将其中的字符以输入相反的顺序输出 例如 34 abc 39 34 cab 39 39 解法1 用for循环的倒叙 但这样并有改变字符串的值 string str 61 34 werthueyihzii
  • eNSP配置ospf——三台路由器

    文章目录 拓扑配置IP地址配置ospfAR1AR2AR3 总结两路由器之间配置ospf xff0c 需要将接口配置为同一网段再宣告 两路由器之间配置ospf xff0c 需要两边都进行宣告 拓扑 配置IP地址 如拓扑图所示 xff0c 不再
  • 【openstack】cloudkitty组件,入门级安装(快速)

    文章目录 前言架构安装配置启动检索并安装 CloudKitty 的仪表板 前言 什么是CloudKitty xff1f CloudKitty是OpenStack等的评级即服务项目 该项目旨在成为云的退款和评级的通用解决方案 从历史上看 xf
  • 性能测试工具iPerf和Netperf使用介绍

    实验教程 任务目的 1 掌握iPerf的功能和基本命令 xff0c 利用iPerf测试主机之间的吞吐量 xff0c 熟悉基本命令参数的作用 xff0c 为后期实验做准备 2 掌握Netperf的功能和基本命令 xff0c 能够根据不同的测试
  • 一、C语言结构体数组

    1 如何定义结构体数组 a 单独写成一行来定义 struct student stu 3 可以用的下标是 stu 0 stu 2 定义结构体数组的时候还可以同时进行初始化 struct student stu 61 struct stude
  • Vmware启动Centos7就蓝屏问题解决方案

    不需要任何花里胡哨的方法 xff0c hyper v也不需要关 xff0c 我尝试过网上各种解决方案都不能解决问题 xff0c 最后发现是Vmware版本问题 xff0c windows最新版本与旧版Vmware不兼容 xff0c 只需要下
  • JAVA学习-hashCode() 和 equals() 的作用和在集合类中的使用建议

    hash 了解 hashCode 之前最好先了解一下 hash Java中实现hash算法 https www cnblogs com wangjiong p 11220583 html hashCode 和 equals hashCode