Java基础知识——equals方法和HashCode方法介绍

java中重写equals和hashCode方法 为什么要重写equals和hashCode方法,hashCode()和equals()定义在Object类中,这个类是所有java类的基类,所以所有的java类都继承这两个方法。 hashCode()方法被用来获取给定对象的唯一整数。这个整数被用来确定对象被存储在HashTable类似的结构中的位置。默认的,Object类的hashCode()方法返回这个对象存储的内存地址的编号。 阅读详情

一、equals方法。

1、当一个对象没覆盖equals方式时,默认情况下equals方法都是调用Object类的equals方法,而Object的

equals方法主要用于判断对象的内存地址引用是不是同一个地址(是不是同一个对象)。

源码如下;

2、要是类中覆盖了equals方法,必须根据具体的代码来确定equals方法的作用了,覆盖后一般都是通过对象

的内容是否相等来判断对象是否相等。

二、案例分析。

(1)、案例一:这里有学生类student。源码如下:

package org.wangkeqing;

public class Student {
	
	private int age;
	private String name;
	
	public Student(int age, String name) {
		super();
		this.age = age;
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public String getName() {
		return name;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public void setName(String name) {
		this.name = name;
	}
	
	public static void main(String[] args) {
		Student stu1  = new Student(20,"张三");
		Student stu2  = new Student(20,"张三");
		System.out.println("stu1 == stu2 : "+(stu1 == stu2));
		System.out.println("stu1.equals(stu2) : "+stu1.equals(stu2));
	}
}
运行结果:

stu1 == stu2 : false
stu1.equals(stu2) : false

案例总结:Student类没有覆盖equals方法,stu1调用equals方法实际上调用的是Object的equals方法。所以采用对象

内存地址是否相等来判断对象是否相等。因为是两个新对象所以对象的内存地址不相等,所以stu1.equals(stu2) 是false。

(2)、案例2:同样是student类,此时覆盖了equals方法,源码如下:

package org.wangkeqing;

public class Student {
	private int age;
	private String name;
	public Student(int age, String name) {
		super();
		this.age = age;
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public String getName() {
		return name;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public void setName(String name) {
		this.name = name;
	}
	
	@Override
	public boolean equals(Object obj) {
		if (this == obj){
			return true;
		}	
		if (obj == null){
			return false;
		}
		if (getClass() != obj.getClass()){
			return false;
		}
		Student other = (Student) obj;
		if (age != other.age){
			return false;
		}
		if (name == null) {
			if (other.name != null){
				return false;
			}
		} else if (!name.equals(other.name)){
			return false;
		}
		return true;
	}
	public static void main(String[] args) {
		Student stu1  = new Student(20,"张三");
		Student stu2  = new Student(20,"张三");
		System.out.println("stu1 == stu2 : "+(stu1 == stu2));
		System.out.println("stu1.equals(stu2) : "+stu1.equals(stu2));
	}
}
运行如下:

stu1 == stu2 : false
stu1.equals(stu2) : true
案例总结:当覆盖了equals方法后,equals运行的结果为true,此时调用的是本身的equals方法。

二、HashCode方法。

通过案例2可以知道,覆盖的equals方法已经生效,在下面的案例3中,我们覆盖student类的hashCode方法,此时先不覆盖equals方法。这里生成HashCode的方法,我们使用name和age来生成哈希码。

package org.wangkeqing;

import java.util.HashSet;
import java.util.LinkedList;
import java.util.Set;

public class Student {
	
	private int age;
	private String name;
	
	public Student(int age, String name) {
		super();
		this.age = age;
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public String getName() {
		return name;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public void setName(String name) {
		this.name = name;
	}
	
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + age;
		result = prime * result + ((name == null) ? 0 : name.hashCode());
		return result;
	}
	
	public static void main(String[] args) {
		LinkedList<Student> list = new LinkedList<Student>();
		Set<Student> set = new HashSet<Student>();
		Student stu1  = new Student(20,"张三");
		Student stu2  = new Student(20,"张三");
		System.out.println("stu1 == stu2 : "+(stu1 == stu2));
		System.out.println("stu1.equals(stu2) : "+stu1.equals(stu2));
		list.add(stu1);
		list.add(stu2);
		System.out.println("list大小:"+ list.size());
		
		set.add(stu1);
		set.add(stu2);
		System.out.println("set大小:"+ set.size());
	}
}


运行结果:

stu1 == stu2 : false
stu1.equals(stu2) : false
list大小:2
set大小:2

案例总结:在student中并没有覆盖equals方法只覆盖了hashCode方法,两个对象虽然hashCode一样,但在将stu1和stu2放入set集合时由于equals方法比较的两个对象是false,所以就没有在比较两个对象的hashcode值。

案例4:同时覆盖equals方法和HashCode方法。源码如下:

package org.wangkeqing;

import java.util.HashSet;
import java.util.LinkedList;
import java.util.Set;

public class Student {
	private int age;
	private String name;
	
	public Student(int age, String name) {
		super();
		this.age = age;
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public String getName() {
		return name;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public void setName(String name) {
		this.name = name;
	}
	
	@Override
	public boolean equals(Object obj) {
		if (this == obj){
			return true;
		}	
		if (obj == null){
			return false;
		}
		if (getClass() != obj.getClass()){
			return false;
		}
		Student other = (Student) obj;
		if (age != other.age){
			return false;
		}
		if (name == null) {
			if (other.name != null){
				return false;
			}
		} else if (!name.equals(other.name)){
			return false;
		}
		return true;
	}
	
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + age;
		result = prime * result + ((name == null) ? 0 : name.hashCode());
		return result;
	}
	
	public static void main(String[] args) {
		LinkedList<Student> list = new LinkedList<Student>();
		Set<Student> set = new HashSet<Student>();
		Student stu1  = new Student(20,"张三");
		Student stu2  = new Student(20,"张三");
		System.out.println("stu1 == stu2 : "+(stu1 == stu2));
		System.out.println("stu1.equals(stu2) : "+stu1.equals(stu2));
		list.add(stu1);
		list.add(stu2);
		System.out.println("list大小:"+ list.size());
		set.add(stu1);
		set.add(stu2);
		System.out.println("set大小:"+ set.size());
	}
}
运行结果:

stu1 == stu2 : false
stu1.equals(stu2) : true
list大小:2
set大小:1
案例4总结:从运行结果可以看出,此时equals方法结果为true,两个对象内容相等。但是==比较的是两个对象的引用地址是否相等。显然,他们不是同一个对象。在把对象存入list和set中,由于HashCode相等,故而在对象存入set中,就是同一个值。

案例5:同时覆盖equals方法和HashCode方法,但是生成不同的HashCode,源代码如下:

package org.wangkeqing;

import java.util.HashSet;
import java.util.LinkedList;
import java.util.Set;
public class Student {
	private int age;
	private String name;
	
	public Student(int age, String name) {
		super();
		this.age = age;
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public String getName() {
		return name;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public void setName(String name) {
		this.name = name;
	}
	@Override
	public boolean equals(Object obj) {
		if (this == obj){
			return true;
		}	
		if (obj == null){
			return false;
		}
		if (getClass() != obj.getClass()){
			return false;
		}
		Student other = (Student) obj;
		if (age != other.age){
			return false;
		}
		if (name == null) {
			if (other.name != null){
				return false;
			}
		} else if (!name.equals(other.name)){
			return false;
		}
		return true;
	}
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + age;
		result = prime * result + ((name == null) ? 0 : name.hashCode());
		System.out.println("hashCode : "+ result);
		return result;
	}
	public static void main(String[] args) {
		LinkedList<Student> list = new LinkedList<Student>();
		Set<Student> set = new HashSet<Student>();
		Student stu1  = new Student(20,"张三");
		Student stu2  = new Student(20,"张三");
		System.out.println("stu1 == stu2 : "+(stu1 == stu2));
		System.out.println("stu1.equals(stu2) : "+stu1.equals(stu2));
		list.add(stu1);
		list.add(stu2);
		System.out.println("list大小:"+ list.size());
		set.add(stu1);
		set.add(stu2);
		System.out.println("set大小:"+ set.size());
		System.out.println("-------------------------------------------------------------");
		stu1.setAge(30);
		System.out.println("删除 stu1 : "+set.remove(stu1));
		System.out.println("set size:"+ set.size());
	}
}

运行结果如下:

stu1 == stu2 : false
stu1.equals(stu2) : true
list大小:2
hashCode : 776470
hashCode : 776470
set大小:1
-------------------------------------------------------------
hashCode : 776780
删除 stu1 : false
set size:1
案例5总结:当我们将某个对象存到set,Map等数据结构中时,如果对象的属性参与了hashcode的计算,那么以后就不能修改该对象参与hashcode计算的那些属性了,否则会引起意向不到的错误的。

equals和hashcode方法重写 在 Java 中,当你需要来判断两个对象是否相等时,就需要重写equals和hashCode方法。 阅读详情

相关推荐

夏令营纪实——东南大学计科院&PALM实验室面试全解析

本文详细解析了东南大学计科院与PALM实验室夏令营的面试全流程,包括前期准备、技术考察、项目经验深挖等关键环节。特别针对自然语言处理(NLP)和机器学习(ML)领域的高频问题提供应对策略,帮助申请者提升面试表现。文章还分享了实用的准备技巧和面试经验,为有意向参加该夏令营的学生提供宝贵参考。

convnet3designer的博客 459

两个对象相等(==、equals、hashCode)详解

一文让你彻底明白 == 与 equals 的区别,hashCode 到底是啥,hashCode 又和 equals 有怎样的关系

m0_54355172的博客 3444

Qt5+OSG实战:如何用osgQOpenGLWidget在窗口中加载3D模型(附完整代码)

本文详细解析了如何在Qt5中使用osgQOpenGLWidget加载和渲染3D模型,涵盖环境配置、核心架构、性能优化及高级技巧。通过实战案例和完整代码,帮助开发者实现工业级3D模型渲染,提升Qt与OSG的整合效率。

weixin_42741930的博客 264

equals方法和hashCode方法详解

一、初识equals()和hashCode()方法 1、首先需要明确知道的一点是:hashCode()方法和equals()方法是在Object类中就已经定义了的,所以在java中定义的任何类都会有这两个方法。原始的equals()方法用来比较两个对象的地址值,而原始的hashCode()方法用来返回其所在对象的物理地址,下面来看一下在Object中的定义:equals:pub

lubiaopan的专栏 6368

利用Matlab高效处理Comsol仿真数据的可视化技巧

本文详细介绍了如何将Comsol仿真数据高效导入Matlab并进行专业可视化与后处理。核心内容包括正确的数据导出格式设置、三维矩阵重构方法、二维截面与三维体渲染技巧,以及基于Matlab的定量分析与批处理自动化流程,帮助工程师和科研人员深度挖掘仿真数据价值,提升工作效率。

weixin_29065791的博客 362

机械臂标准DH建模及正运动学分析(以IRB4600型工业机械臂为例)

对于工业机械臂而言,运动学是不考虑力学特性的情况下对机械臂的几何参数与其位置、速度、加速度等运动特性的关系研究。DH建模是运动学的基础,全称为Denavit-Hartenberg建模方法,是一种广泛应用于机器人运动学中的建模技术。该方法通过在每个连杆上建立坐标系,并利用齐次坐标变换来实现连杆之间的坐标转换。通过依次变换,可以推导出末端执行器相对于基坐标系的位姿,从而建立机器人的运动学方程。以IRB4600型六自由度工业机械臂为例,选择标准DH建模方法,建立其正运动学模型。

chen_mp的博客 1万+

Java中的Hash Code到底是什么?

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一、pandas是什么? 二、使用步骤 1.引入库 2.读入数据 总结 前言 作为Java的初学者,我们总会碰到一些概念上的问题。我最近学习就碰到了一个问题:hashcode是什么?它有什么用?在查阅了众多博文后,我对hashcode有了初步认识,将我所学习到的知识写在这里和大家分享。欢迎关注我,和我共同成长进步。 本文主要参考到的链接有 What is a hash code in.

weixin_49895102的博客 5225

数据结构——滑动窗口

入:下标为 i 的元素进入窗口,更新相关统计量。如果 i < k−1 则重复第一步更新:更新答案。一般是更新最大值 / 最小值出:下标为 i−k+1 的元素离开窗口,更新相关统计量✔1. 定长子串中元音的最大数目✔2. 找到一个数字的 K 美丽值✔4. 子数组的最大平均数 |方法一:前缀和方法二:滑动窗口7. 得到 K 个黑块的最少涂色次数8. 爱生气的书店老板9. 几乎唯一子数组的最大和10. 长度为 K 子数组中的最大和11. 可获得的最大点数12. 最少交换次数来组合所有的1 ||

qq_68915288的博客 762

JavaBean关于为什么要重写hashCode()方法和equals()方法及如何重写

记得有一次去面试Java软件开发工程师,面试官问了我一个关于JavaBean为什么要重写hashCode()方法和equals方法,我记得当时我巴拉巴拉半天就是没有说到重点,现在想一想归根到底还是我对这两个的理解不深刻,现在我特定来总结下.hashCode 方法用于散列集合的查找,equals 方法用于判断两个对象是否相等。 一、我们为什么需要重写hashCode()方法和equals()方法?...

阿武刚巴得 6056

AgentScope 实战训练营-构建元规划智能体(Meta Planner Agent)—— 从 0 到 1 完整实现

本文介绍了基于AgentScope框架开发的元规划智能体(Meta Planner Agent)系统。该系统通过任务拆解和子代理编排机制,实现复杂任务的自动化处理。核心架构分为用户层、规划器层和子代理层,其中规划器作为"项目经理"负责任务分解、创建子代理并协调执行流程。关键技术包括AgentScope多智能体框架、DashScope大语言模型、PlanNotebook计划管理工具等。

program哲学 360

基于自抗扰控制的虚拟同步发电机二次调频控制研究

摘要:本文针对高比例可再生能源并网导致的电力系统频率稳定性问题,提出基于自抗扰控制(ADRC)的虚拟同步发电机(VSG)二次调频控制策略。通过分析VSG工作原理和传统调频方法的不足,设计了非线性ADRC和线性ADRC两种控制器,详细阐述了参数整定方法。仿真结果表明,该策略能有效消除频率稳态偏差,提升系统抗扰能力,为分布式电源参与电网调频提供了新思路。 关键词:虚拟同步发电机;自抗扰控制;二次调频;频率调节;抗扰能力

huanghm88的专栏 244

Java提高篇之hashCode

本文转自:http://www.cnblogs.com/chenssy/p/3651218.html 在前面三篇博文中LZ讲解了(HashMap、HashSet、HashTable),在其中LZ不断地讲解他们的put和get方法,在这两个方法中计算key的hashCode应该是最重要也是最精华的部分,所以下面LZ揭开hashCode的“神秘”面纱。 hashCode的作用

lixiaoxiong的专栏 2867

innovus中如何设置cts参数

上面是设置cts的一般设置,如果需要对某些skew group或者某些clock tree设置不一样的参数,如需要对clk1这个clock设置不一样的inverter,可以使用。需要查询已经设置过的ccopt参数,可以使用get_ccopt_property去查询,方法和set_ccopt_property一致。言归正传,cts的设置命令是set_ccopt_property,获取命令是get_ccopt_property。另外,set_ccopt_property提供一套命令查询方法。

芯冰乐 545

Java重写ToString()、equals和hashCode区别

0. "==" 和 equals区别 Object类中的equals方法和“==”是一样的,没有区别,即俩个对象的比较是比较他们的栈内存中存储的内存地址。而String类,Integer类等等一些类,是重写了equals方法,才使得equals和“==不同”,他们比较的是值是不是相等 //“==”对于基本数据类型,判断两个变量的值是否相等。/“equal”不能用于基本数据类型 1、为什么要重写ToString? 所有的对象都会有这个方法【继承Object】,如下默认情况下:getName+@

weixin_35821291的博客 877

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Java基础面试题06:hashCode()和equals()方法的重要性体现在什么地方?

Java中的hashCode()和equals()方法看似是干同一件事,但它们的使用场景和作用却大有不同。为了让程序更高效、更准确地运行,我们需要对这两者有深入的了解,并掌握它们的重写规则。hashCode()是用来返回一个哈希值(int类型)的,它的作用是确定对象在散列表(如HashMap或HashSet)中的存储位置。// 输出结果为3104哈希值的作用可以把哈希值看成是对象的身份证号,散列表会根据这个“身份证号”快速定位到对象的位置。定义在哪hashCode()方法定义在。

程序员江小北 1431

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

重写hashcode和equals方法

一。前言 我们都知道,要比较两个对象是否相等时需要调用对象的equals()方法,即判断对象引用所指向的对象地址是否相等,对象地址相等时,那么与对象相关的对象句柄、对象头、对象实例数据、对象类型数据等也是完全一致的,所以我们可以通过比较对象的地址来判断是否相等。 二。Object源码理解 对象在不重写的情况下使用的是Object的equals方法和hashcode方法,从Object...

简乐君 7万+

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Java 细品 重写equals方法 和 hashcode 方法

前言 在我们需要比较对象是否相等时,我们往往需要采取重写equals方法和hashcode方法。 该篇,就是从比较对象的场景结合通过代码实例以及部分源码解读,去跟大家品一品这个重写equals方法和hashcode方法。 正文 场景: 我们现在需要比较两个对象 Pig 是否相等 。 而Pig 对象里面包含 三个字段, name,age,nickName ,我们现在只需要认为如果两个pig对象的name名字和age年龄一样,那么这两个pig对象就是一样的,nic...

默默不代表沉默 6213

Java中equals()和HashCode()的关系

前言 上一篇文章简单分析了equals()与==的关系,本文我们再来看看equals()与hashcode()的关系。hashcode的使用还是有很多坑的,一起看看吧~ 本文主要有以下几点来分析: hashCode使用中产生的问题 equals/hashcode的渊源 产生问题的原因 正确的使用姿势 hashCode使用中产生的问题 注:HashSet是一个无序、不可重复的集合,我们做一个小测...

LarsCheng's Blog 1万+

java中hashcode和equals的区别和联系

理解: 规范1:若重写equals(Object obj)方法,有必要重写hashcode()方法,确保通过equals(Object obj)方法判断结果为true的两个对象具备相等的hashcode()返回值。说得简单点就是:“如果两个对象相同,那么他们的hashcode应该 相等”。不过请注意:这个只是规范,如果你非要写一个类让equals(Object obj)返回true而hashco...

qq_42273599的博客 7401

【为啥要重写 hashcode和equals 方法】

JavaEE[数据结构]-关于重写hashcode和equals方法的原因

2301_76249062的博客 1568

Java基础——equals和hashcode

在 Java 中,`equals` 和 `hashCode` 方法密切相关,必须保持一致性:如果两个对象通过 `equals` 方法相等,它们的 `hashCode` 也必须相同。这对于基于哈希的数据结构(如 `HashMap`、`HashSet`)至关重要,因为这些结构依赖哈希值进行快速查找和存储。为了减少哈希冲突,`hashCode` 的计算通常结合多个字段,并使用质数(如 31)进行乘法,以保证哈希值的均匀分布和较低的冲突率。

hello77的blogggg 祝你得偿所愿 2267

Java 细品 重写equals方法 和 hashcode 方法

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》,点击传送门,即可获取! public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}public String getNickName() {return nickName;}public void setNickName(String nickName) {this.nickName = nickName;}}可以看到

2401_84092832的博客 1530

hashCode和equals的区别

点击上方“蓝字”技术的故事还有很多 只想与你静静分享N和我公众号后台回复“java”,获得作者Java知识体系/面试必看资料Hello,大家好,我是子悠,作为本...

Java极客技术 1478

Java 如何重写对象的 equals 方法和 hashCode 方法

对类中每一个重要字段,也就是影响对象的值的字段,也就是 equals 方法里有比较的字段,进行以下操作:a. 计算这个字段的值 filedHashValue = filed.hashCode();其实当 equals 方法被重写时,通常有必要重写 hashCode 方法,以维护 hashCode 方法的常规协定,该协定声明相等对象必须具有相等的哈希码。既然比较两个对象是否相等,使用的是 equals 方法,那么只要重写了 equals 方法就好了,干嘛又要重写 hashCode 方法呢?

2401_89224864的博客 1253

equals方法与hashcode方法的重写

很显然,输出的结果无论是用的==比较还是用的equals比较都是false;散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。诸如String、Date等类对equals方法进行了重写的话,比较的是所指向的。经过哈希表达式计算后的hashcode相等的实在不好找,就不敲代码测试了,欸嘿~当发生冲突时,对应的存储单元以链表的形式保存冲突的数据(链地址法)。常见的散列表实现方式:用数组作为哈希函数的输出域,引用类型的变量所指向的对象的地址。

SuYuewu的博客 1913

Object类当中的equals和hashCode方法

Object类当中的equals和hashCode方法 **前言:**最近学习过程中,碰到了涉及需要对equals方法,和hashCode方法的重写,发现对之前的java基础知识有点陌生了,所以有必要去复习一下,然后顺便记录一下。 我们知道equals方法hashCode都是Object这个超类当中的方法。进入jdk的源码看一下。 1.equals()方法 /** * Ind...

莫失莫忘的博客 1295
上一篇: Java基础知识——hashCode的作用
下一篇: Java反射机制——反射的介绍(一)
spring_model
博客等级 码龄11年 36粉丝 47原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值