equals和hashCode方法分析

1.HashSet存放的是无序,不能重复的对象,当添加一个对象的时,它会先检查此对象的
hashCode值是否与集合中对象的hashCode值相等,如果不等,直接将对象加进去,如果相等,则再用equals方法判断,如果返回的是true表示集合中已经存在此对象,不再进行添加,若返回false将对象添加进去

2.简单来说,如果两个对象equals返回true则它们的hashCode值一定相等,如果返回false它们的hashCode不一定不同,因为equals判定的是否为同一个对象,当然这是针对未被重写来说

看下面例子


import java.util.HashSet;

public class SetTest {

public static void main(String[] args) {
HashSet set = new HashSet();
Student s1 = new Student("zhansan",20);
Student s2 = new Student("zhansan",20);
set.add(s1);
set.add(s2);
System.out.println(set);
}

}

class Student {
private String name = null;

private int age = 0;

public Student(String name, int age){
this.name = name;
this.age = age;
}

public int getAge() {
return age;
}

public void setAge(int age) {
this.age = age;
}

public String getName() {
return name;
}

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;
}

@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
final 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;
}
}




如果不对Student类重写equals方法和hashCode方法,当new两个内容相同的对象时,HashSet还是会添加进去,因为两对象的hashCode值不一样,如果像上面那样写了的话则是对内容进行判断,内容相同不再添加
Agent应用实践之二十九 - 设计模式:人机协同 本章讲解了一种比较常见的设计模式:人机协同。通过一些场景举例,同时使用AgentScope本身自带的能力实现的人机协同模式,最后通过源码分析了AgentScope中如何实现。通过了解人机协同模式对于实际工程使用也是非常有用的。 阅读详情

相关推荐

PMOS过压保护电路设计与仿真优化策略

本文深入探讨PMOS过压保护电路(OVP)的设计与仿真优化策略,详细解析PMOS管选型、稳压管特性及三极管配置等关键要素。通过Proteus仿真案例揭示典型设计误区,并提供响应速度提升、抗干扰设计等进阶优化方案,助力工程师实现高可靠性的电源保护系统设计。

weixin_42620340的博客 440

关于Object中equals方法和hashCode方法判断的分析

首先提出这样一个问题:如果两个对象不相同,他们的hashCode值一定不相等吗?我们都知道equals和hashCode是Object中的方法,java中每一个对象都具有这两个方法。equals(Object obj):判断两个对象是否“相同”,返回true或false;public boolean equals(Object obj) { return (this == obj)...

haozz的博客 1816

保姆级教程:在RK3568开发板上手把手配置RMII百兆以太网DTS节点

本文提供了一份详细的RK3568开发板RMII百兆以太网DTS节点配置教程,涵盖基础概念解析、关键参数设置、实际操作步骤及常见问题排查。通过手把手指导,帮助开发者快速完成RK3568开发板的以太网配置,特别适合嵌入式系统开发者参考。

weixin_33686714的博客 137

HashSet储存对象时重写equals和hashcode方法时的情景分析

HashSet储存对象时重写equals和hashcode方法时的情景分析Set 接口的特点:hashCode() 与 equals()两种情形情形一示例:情形二示例:总结 Set 接口的特点: 1.它不允许出现重复元素-----------无重复 2.不保证集合中元素的顺序---------无序 3.允许包含值为null的元素,但最多只能有一个null元素。 hashCode() 与 equals() HashSet集合,采用哈希表结构存储数据,保证元素唯一性的方式依赖于:hashCode

haoweixl的博客 1093

手把手教你用TBtools+MCScanX完成玉米基因家族共线性分析(附完整代码)

本文提供了一套完整的玉米基因家族共线性分析实战流程,详细讲解了如何从数据准备、格式处理开始,利用DIAMOND进行快速比对,再结合MCScanX进行核心共线性区块鉴定,最后通过TBtools实现从全基因组圈图到特定基因家族微共线性图的可视化。教程包含可直接运行的代码与常见问题解决方案,帮助研究者高效完成从命令行计算到图形化展示的全过程。

tech5的博客 591

AD7768与STM32F439的硬件设计避坑指南:如何优化高精度ADC系统的电源与PCB布局

本文详细解析了AD7768与STM32F439在高精度ADC系统硬件设计中的关键问题与优化方案。从电源系统设计、PCB布局到基准电压选型,提供了实用的避坑指南和实测数据,帮助工程师提升系统性能至110dB动态范围。特别强调了SPI信号布线和电源滤波对ADC精度的重要影响。

sugar的博客 735

为什么要重写hashCode和equals方法【深入分析版】

在回答这个问题前,我们先来看看Object类中的这两个方法: public native int hashCode(); public boolean equals(Object obj) { return (this == obj); } 其中hashCode调用的是本地方法,如果子类补充下默认调用的是本地方法。Java平台有个用户和本地C代码进行互操作的AP...

pocher的博客 5563

CentOS 7 常用命令大全

CentOS中Linux命令

m0_63075763的博客 2018

重写equals方法不重写hashcode方法分析

重写equals方法需要遵循Java如下规则,否则编码行为会难以揣测: 自反性:对于任意的对象x,x.equals(x)返回true(自己一定等于自己); 对称性:对于任意的对象x和y,若x.equals(y)为true,则y.equals(x)亦为true; 传递性:对于任意的对象x、y和z,若x.equals(y)为true且y.equals(z)也为true,则x.equals(z)亦...

m_ddNice的博客 479

保姆级教程:用MATLAB搞定双目相机标定,从导入图片到参数解读全流程

本文提供了一份详细的MATLAB双目相机标定全流程指南,涵盖从图片准备到参数解读的每个环节。重点讲解了棋盘格选择、拍摄技巧、MATLAB工具箱设置及参数优化,帮助读者避免常见错误并提升标定精度。特别适合机器人导航、三维重建等领域的开发者。

weixin_33737134的博客 428

CDD数据库文件制作(十一)——服务配置(0x19_DTC Code)

虽然选择Copy和Reference都可以加载DTC,但是如果我们在DTC库中有修改DTC,通过Copy的方式加载的DTC在DTC Table中不会跟着DTC库的修改而自动更新。通过Reference的方式加载的DTC可以自动更新。找到Fault Memory的DTC Table,鼠标放在DTC Table区域,右键点击选择Copy …根据需要(客户协议)勾选响应的19服务子功能。如何创建一个新的DTC code?按照字母与下方要素可做一一对应。首先在DTC库中新建DTC。支持10 01/10 03。

LOVE135149的博客 1917

HashSet的hashcode()和equals()方法的分析说明

1. 首先equals()和hashcode()这两个方法都是从object类中继承过来的。 equals()方法在object类中定义如下: public boolean equals(Object obj) { return (this == obj); } 很明显是对两个对象的地址值进行的比较(即比较引用是否相同)。但是我们必需清楚,当String、Math、还有Inte

“点点”专栏 1022

【SpringBoot 3.x 第43节】你还敢说 Spring 启动慢是“宿命”?Spring AOT 把启动剧本都提前写死了,你服不服?

🏆本文收录于《滚雪球学SpringBoot 3》,专门攻坚指数提升,本年度国内最系统+最专业+最详细(永久更新)。

**My Coding Family** 539

HashCode和equals方法深度分析

  今天在网上看到一篇转载率很高,介绍HashCode和equals两个方法的文章,觉得说错了.现在把我的想法写出来,供大家一同参考    在往HashSet集合中放数据的时候,由于HashSet底层是用HashMap中的Key属性存储的,所以是不能重复的,那他如何判断其不是重复的元素呢.这个时候他判断有两步.  1.调用元素的hashcode方法,判断两对象的hashCode是否相等

java05的专栏 2187

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

java重写equals和hashcode方法分析

通常业务中我们定义两个对象,如果他们属性相同的话,就认为他们是相等的。但是Object自带的equals方法,是用==比较的,比较的对象引用,但是不一个对象地址,也有相同属性内容,业务需要让他俩equals相同,所以就需要重写equals了(如果不懂看这篇文章)这是Object自带的equals方法,内部是==比较的对象引用。public boolean equals(Object obj) { ...

Mint6的博客 1003

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

java object hashcode equal_关于Object中equals方法和hashCode方法判断的分析

首先提出这样一个问题:如果两个对象不相同,他们的hashCode值一定不相等吗?我们都知道equals和hashCode是Object中的方法,java中每一个对象都具有这两个方法。equals(Object obj):判断两个对象是否“相同”,返回true或false;public boolean equals(Object obj) {return (this == obj);}hashCod...

weixin_33901449的博客 221

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

彻底搞懂equals以及hashCode方法(源码级分析)

equals方法以及hashCode方法分析

qq_66468682的博客 1400

一文搞懂为什么要同时重写equals方法和hashCode方法+实例分析

一文搞懂为什么要同时重写equals方法和hashCode方法+实例分析

m0_51358164的博客 1336

【源码分析】不同类型hashcode和equals方法

返回此字符串的散列码。String对象的哈希码计算为。

weixin_43457608的博客 204

Object类的equals方法与hashcode方法分析

Object类的equals方法与hashcode方法分析 equals 源代码 public boolean equals(Object obj) { return (this == obj); } 概述 指示其他对象是否等同于这个对象。 equals方法在非空对象引用上实现等价关系: 自反性:对于任意非空引用值x,x.equals(x)会返回true 对称性:...

业精于勤-行成于思 1176

String源码分析之equals和hashcode方法

1.说明== :如果是非引用类型,则值相等;引用类型,则地址相同,也就是指向堆中相同的对象 equals:Object对象而言或者没有重写equals方法的类,等效于==;重写了equals方法则按子类的方法来比较2.String的equals方法2.1 先看代码 public boolean equals(Object anObject) { if (this == anObje

u010627840的专栏 1362

【Java基础】分析重写equals()方法就必须重写hashCode()方法的原因

equals()方法和hashCode()方法是用来做什么的? equals()方法 该方法就是用来判断两个对象是否是同一个对象。在Object类源码(如下所示)中,其底层是使用了“==”来实现,也就是说通过比较两个对象的内存地址是否相同判断是否是同一个对象。 public boolean equals(Object obj) { return (this == obj); } 但是在实际...

墩墩分墩 447

重写equals方法,必须要重写hashcode方法的原因分析

保证在equals相同的情况下hashcode值必定相同,如果重写了equals而未重写hashcode方法,可能就会出现两个没有关系的对象equals相同的(因为equal都是根据对象的特征进行重写的),但hashcode确实不相同的。采取重写hashcode方法,先进行hashcode比较,如果不同,那么就没必要在进行equals的比较了,这样就大大减少了equals比较的次数,这对比需要比较的数量很大的效率提高是很明显的,一个很好的例子就是在集合中的使用。所以两个都重写才能保障是同一个对象。

FLGB 189

java hashCode()与equals()方法深入分析

hashCode()与equals()深入分析  首先要知道,Object中hashCode方法是native方法,会根据一定的规则将与对象相关的信息(比如对象的存储地址,对象的字段等)映射成一个数值,这个数值称作为散列值。 1.为什么重写equals()方法的同时也要重写hashCode()方法?   重写之前equals() 方法比较的是引用是否相同,与“==”作用一样。   重写之后比较的是...

qq_41740017的博客 162

分析重写hashCode()和equals()方法前后一些变化的实验

每次存值时就会先调用hashCode方法比较返回值相同后再调用equals方法、再相同时则认定为重复元素不存储了;自己经测试、仅重写hashCode()和equals()方法其中之一均不能达到去重目的

m0_62576090的博客 371

重写hashcode和equals方法

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

简乐君 7万+
上一篇: ArrayList与LinkedList分析
下一篇: TreeSet分析
lk231_java
博客等级 码龄15年 0粉丝 69原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值