equals(),==,hashCode()

XILINX RFSoC全面解析(五)—— Zynq UItrascale+ RF Data Converter IP核详解 这期我们来看看RFSoC独有的IP核——Zynq UItrascale+ RF Data Converter如何使用。 我使用的VIVADO版本是2018.3,这个是最低版本,要开发RFSoC,VIVADO版本必须不低于2018.3。 另外电脑配置也需要很高,64位,8核@3.4GHz CPU,16GB内存,固态硬盘基本就是低配,跑起来很勉强。建议有条件的朋友使用工作站或者服务器。 首先在VIVADO中新建一个工程,因为我使用的是xilinx官方的开发板,所以可以直接设定选board就行。 在I 阅读详情

本来是要梳理在hash集合中,是如何利用equals()和hashCode()判定元素是否重复,但是要说equals()就要谈==,索性一起总结。

参考博文:https://www.cnblogs.com/skywang12345/p/3324958.html

强烈推荐一看。

equals()和==

当是普通数据类型(int,double,char等),==是直接比较值,如果是引用类型数据(String,对象),==是地址比较。

查看超类Object中的源码:

    public boolean equals(Object obj) {
        return (this == obj);
    }

可见Object中的equals()和==没有区别。

看equals()在String和AbstractSet中的源码:

二者都覆写了equals()方法,在进行==比较的基础上,还有其他比较。

以String为例,如果两个字符串==返回true,equals()必定返回true;如果==返回false,那么会对字符串中的字符逐一比较,如果字符都相同,equals返回true。

equals()和hashCode()

equals()和hashCode()之间并没有关系,但在hash table算法的集合(hashSet,hashMap等)中,只有当equals()返回为ture,并且两个对象的hashCode()相同,HashSet才会判定为重复元素。

看一下在Set中,关于两个不可重复(duplicate)元素的描述:

/**
 * A collection that contains no duplicate elements.  More formally, sets
 * contain no pair of elements <code>e1</code> and <code>e2</code> such that
 * <code>e1.equals(e2)</code>, and at most one null element.  As implied by
 * its name, this interface models the mathematical <i>set</i> abstraction.
 //...
**/

set不可以有两个元素e1.equals(e2),如果e1,e2属性都相同,在开发者看来,e1和e2是相同的对象,但是在自定义类中不重写equals()方法的话,那么equals()只进行地址比较(使用的是Object中的equals()方法),就会判定e1和e2是两个不同对象,这显然不符合开发者的需求,所以在自定义类中需要重写equals()方法,将对象内容逐一比较。

但equals()的结果为true,不一定说e1和e2就是两个不同元素了。还要看hashCode。

看下面的代码示例:

public class Test {
	public static void main(String[] args) {
		HashSet<Person> hs = new HashSet<Person>();

		Person e1 = new Person("龙根子", 13);
		Person e2 = new Person("龙根子", 13);
		Person e3 = new Person("罗大吊", 17);

		hs.add(e1);
		hs.add(e2);
		hs.add(e3);

		System.out.println("e1和e2是否相同:" + e1.equals(e2));
		System.out.println("e1_hashCode:" + e1.hashCode());
		System.out.println("e2_hashCode:" + e2.hashCode());

		Iterator<Person> iterator = hs.iterator();
		while (iterator.hasNext()) {
			System.out.println(iterator.next());
		}
	}
}

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

	public String name;
	public int age;

	// 重写equals()方法,将对象属性逐一比较,如果都相同,返回true
	@Override
	public boolean equals(Object obj) {
		super.equals(obj);
		Person per = (Person) obj;
		if (this.name == per.name && this.age == per.age) {
			return true;
		} else {
			return false;
		}
	}

	@Override
	public String toString() {
		return this.name + "--" + this.age;
	}

}

输出内容:

e1和e2是否相同:true
e1_hashCode:118352462
e2_hashCode:1550089733
龙根子--13
罗大吊--17
龙根子--13

可以看到,即使equals()为true,还是存入了重复的对象。

这是因为二者的hashCode不同,所以HashSet在添加e1和e2的时候,还是认为二者不同。

再重写hashCode()方法:

public class Test {
	public static void main(String[] args) {
		HashSet<Person> hs = new HashSet<Person>();

		Person e1 = new Person("龙根子", 13);
		Person e2 = new Person("龙根子", 13);
		Person e3 = new Person("罗大吊", 17);

		hs.add(e1);
		hs.add(e2);
		hs.add(e3);

		System.out.println("e1和e2是否相同:" + e1.equals(e2));
		System.out.println("e1_hashCode:" + e1.hashCode());
		System.out.println("e2_hashCode:" + e2.hashCode());

		Iterator<Person> iterator = hs.iterator();
		while (iterator.hasNext()) {
			System.out.println(iterator.next());
		}
	}
}

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

	public String name;
	public int age;

	// 重写equals()方法,将对象属性逐一比较,如果都相同,返回true
	@Override
	public boolean equals(Object obj) {
		super.equals(obj);
		Person per = (Person) obj;
		if (this.name == per.name && this.age == per.age) {
			return true;
		} else {
			return false;
		}
	}
	
	//重写hashCode()
	@Override
	public int hashCode() {
                //二者的name,age如果相同的话
		//返回nameHash^age的值也一定相同
		int nameHash = name.toUpperCase().hashCode();
		return nameHash ^ age;
	}

	@Override
	public String toString() {
		return this.name + "--" + this.age;
	}
}

输出结果:

e1和e2是否相同:true
e1_hashCode:40114077
e2_hashCode:40114077
罗大吊--17
龙根子--13

可以看到e1.equals()为true,e1和e2的hashCode相同,所以HashSet判定二者为重复(duplicate)元素,所以不会重复存入。

【maven】idea左侧External Libraries里,没有Maven的依赖包 代码飘红 文章目录1.概述M.参考 1.概述 因为内网开发,然后这几天我被隔离了,然后公司搞了一个外网的vpn能连接的云桌面,云桌面也是网络隔离的,因此只能自己拷贝相关的文件到里面。 然后我就拷贝了代码和maven仓库中的一部分,因为本地的20G一次拷贝不完,需要多次拷贝,但是我拷贝了kafka,仍然飘红。具体如下 idea左侧External Libraries里,没有Maven的依赖包 然后整了很久都没搞定,后来我自己新建了一个项目,然后引入发现是不可以的,而且框框里面的飘红。 然后我就想是不是因为缺少依赖 阅读详情

相关推荐

数字图像处理第九章笔记

目录一、腐蚀与膨胀1、腐蚀2、膨胀3、对偶性4、开操作与闭操作二、一些基本的形态学算法1、边界提取2、孔洞填充3、连通分量提取4、凸壳5、细化6、粗化7、骨架8、形态学重建三、灰度级形态学1、腐蚀和膨胀2、开运算和闭运算3、灰度级形态学算法 一、腐蚀与膨胀 1、腐蚀 腐蚀可以去除图像的某些部分。 2、膨胀 膨胀可以连接裂缝。 3、对偶性 膨胀和腐蚀彼此关于集合求补运算和反射运算是对偶的 4、开操作与闭操作 开操作:B对A先腐蚀,再进行膨胀 可以平滑物体轮廓,断开较窄的狭颈并消除较细的突出物。 闭操作

方悔读书迟 1375

Java学习心得之equals方法

一、equals方法简介 equals方法是Object类中的一个方法,通过重写该方法提供判断对象是否相等的逻辑。 1.euqals用法 Dog实体类: public class Dog { private String color; private int weight; private int height; public Dog(String color,int we

寒风中的信 589

Oracle11g安装教程、配置实例、监听、客户端程序详解_Windows篇

Oracle11g安装教程、配置实例、监听、客户端程序详解_Windows篇 文章目录Oracle11g安装教程、配置实例、监听、客户端程序详解_Windows篇前言一、数据库的安装前准备,前提是没有安装过!!!二、仅安装数据库软件(数据库运行环境)三、添加数据库实例四、设置监听程序,让数据库可以通过网络访问五、为目标数据库设置网名总结 前言 如果需要安装包:联系我看到会给你链接,因为现在官网已经不提供10g,11g的安装包了,在网盘保存望悉知(回复不会很及时,下班看到会回复敬请谅解)。 提示:以下

zhx__的博客 5630

java中,关于equals方法的研究理解

        equals()方法和“==”的区别这样一个问题在网上一搜一大片,回答水平也参差不齐。昨日笨猪特意去研究了一下这个问题。。。得出了以下见解:        笨猪认为,equals()方法和“==”根本没有可比性,根本不存在什么异同。        equals()是一个方法,而“==”是java运算符,怎么能把他们进行相比呢?                    基...

iteye_12779的博客 187

PPT太丑?用InDesign制作电影级的交互式在线演示文档

本文旨在解决传统演示软件(如PowerPoint、Keynote)在制作商业提案、设计报告时,普遍存在的模板化严重、视觉表现力不足、动态效果廉价的核心痛点。我们将介绍一套常被设计师们“误解”或“忽略”的“降维打击”工作流,核心是利用印刷排版软件 Adobe InDesign 强大的版式控制、动画与交互功能,来创建电影级的动态演示文稿,并通过其 在线发布 (Publish Online) 功能,一键生成可在任何浏览器中流畅访问的网页版交互式文档,从而极大地提升提案的专业度与视觉冲击力。

Kingsdesigner的博客 1281

微信小程序中蓝牙打印机中文编码处理:使用iconv-lite库

本文介绍了微信小程序集成蓝牙打印机时中文乱码问题的解决方案。由于打印机通常仅支持GBK/GB2312编码,而小程序使用UTF-8,导致中文显示异常。通过引入轻量级iconv-lite库进行编码转换,可高效解决该问题。文章详细说明了从库安装、编码转换到蓝牙发送的实现步骤,并提供了完整代码示例。关键注意事项包括编码验证、分段发送和兼容性测试。该方法经实际验证,能有效保障中文打印的准确性,适用于零售、物流等场景。

canglingyue的专栏 1310

equals方法返回true的两个对象,其hashCode方法返回相同的值

下列代码为JDK API中HashMap的一部分, static class Entry&lt;K,V&gt; implements Map.Entry&lt;K,V&gt; { final K key; V value; Entry&lt;K,V&gt; next; // the next Entry object final i...

hello 649

注意力机制与经典 CV 网络:PyTorch 实现与实战

注意力机制(SE/空间/CBAM/Non-Local)通过权重重标定让模型聚焦关键特征,经典 CNN(ResNet/DenseNet/FPN)提供了深层网络、特征复用和多尺度融合的基础骨架。建议先在 ResNet 上插入 SE 模块(通道注意力)做基线实验,再根据任务类型引入空间注意力(分割任务)或非局部注意力(视频任务)。CIFAR-10 数据集适合快速验证注意力模块的有效性,迁移到更大数据集时保持相同的结构设计思路即可。

FJN110的博客 62

[转]java基础学习总结——equals方法

一、equals方法介绍 1.1.通过下面的例子掌握equals的用法 1 package cn.galc.test; 2 3 public class TestEquals { 4 public static void main(String[] args) { 5 /** 6 * 这里使用构造方法Cat()在...

weixin_34072159的博客 289

大语言模型与ROS集成的自然语言机器人控制:开源框架与应用实例

近年来,大语言模型(LLM)与机器人操作系统(ROS)的集成逐步成熟,使得自然语言驱动的机器人控制成为可能。用户输入“捡起绿色方块”或“把微波炉里的饭热好端过来”这类日常语句,机器人能够自动拆解步骤、规划动作并执行。本文梳理2026年前后发布的三个代表性开源框架——ROS-LLM、ROSClaw以及LLM+Nav2基准测试系统,介绍其技术路径与工程落地情况。

Studying…… 634

群晖如何安装软路由OpenWrt/iStoreOS作为旁路由(含网络设置、设置密码、还原出厂设置等linux命令ipk包)

openwrt的固件。

XiaoqiangClub的博客 7017

重写equals方法

|--需求说明 要求通过毛色,名字,品种来判定两条狗是不是同一条狗 |--实现方法 通过重写equals方法,对比毛色,名字,品种,这几个属性一致,则判定是同一条狗 |--代码内容 1 public class Dog { 2 private String name; 3 private String color; 4 priva...

weixin_30908103的博客 220

Go游戏服务器开发的一些思考(一):语言层面

Go是比C++更好用的高级语言使用Go作为服务器开发的主语言前,首先需要对Go语言做下定性。在接触Go前,可能给人的印象(至少是我),Go是一门脚本语言。看了 官方文档 ,才知道Go是一门高级语言。与C++相比,它有以下优势: 面向接口的编程没有C++复杂的面向对象语法,如类、继承、多态、虚函数等等。Go中只有结构与接口,从语言层面上,直接指导功能与功能间的解耦。直接且语法简单 提供语言反射机制提供

范安崇的博客 9560

equals(),==,hashcode()

equals和== 1“==”判断两个引用对象是否指向同一内存地址 2“equals()”判断两者的内容是否相等属于java.lang.Object的方法。每个子类可以覆写该方法来实现自己的内容相等。 3“equals()”Object类中默认是靠&amp;quot; ==”识别,但是其他类像Integer,String会覆盖掉实现自己的equals方法; String a = new String(&amp;quot;abc&amp;quot;);...

qq_38068863的博客 227

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Java中equals()、==、hashCode()理解!

1.equals()方法 首先equals()方法是基类Object的一个成员方法,所有的实体类都继承了Object类,equals()分为两种情况。如下: Shallow Cap 深度比较 第一种:我们来看官方文档中给的Object类的equals方法的解释 (官方文档地址) Indicates whether some other object is “equal to” this...

qq_36342330的博客 175

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Object类-equals()、==、hashCode()

一、Object类简介 java.lang包中定义的Object类是所有Java类的根父类,其中定义了一些实现和支持面向对象机制的重要方法。任何Java对象,如果没有父类,就默认它继承了Object类。因此,实际上,以前的定义是下面的简略: Java代码   public class A extends Object{}   public class A exten

u013253463的专栏 376

Java常见笔试题2:深拷贝,浅拷贝,clone(),==,equals(),hashCode()

接下来,修改了s2的name,按照浅拷贝的逻辑,引用对象,应该会造成s1.name也发生变化,但是,当执行 s2.name = “hj2” 时,实际上是创建了一个新的 String 对象 “hj2”,并将 s2.name 指向这个新对象。==是操作符,对于基础类型,只能用==来比较,就是字面的表现,一样返回true,不一样返回false;equals()也是Object中的方法,在Object,它也是跟==一样,对比的是引用,但是我们常见的一些引用类型都重写了这个方法,通常是比较对象里的具体内容的。

weixin_44131265的博客 817

JAVA中==,equals(),hashCode()

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一、pandas是什么? 二、使用步骤 1.引入库 2.读入数据 总结 前言 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。 提示:以下是本篇文章正文内容,下面案例可供参考 一、pandas是什么? 示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数..

Versus666的博客 232

面试必知必会的 == equals() 和HashCode()区别

引言:通常面试官问 == 和 equals 区别是什么? 有些人会回答 == 判断对象是否是同一个对象判断引用是否相同 equals 判断值是否相同 ==:用于判断两个对象的地址是不是相同。判断是不是同一个对象(基本数据类型比较的是值,引用类型比较的是内存地址) equals: 情况1:可以看到底层代码 如果类对equals(Object obj) 未进行覆盖时 与 == 是一样的 ...

weixin_43846428的博客 1580

java中“==”和equals()以及hashCode()的理解

重写前:==表示两个对象的内存地址              equals()也表示对象内存地址              hashCode()表示该对象在JVM中的32位内存地址 重写后:==仍表示两个对象的内存地址               equals()表示连个对象的值是否相等,相等就视为同一个对象               如果equals()方法重写,那么hashCode

咸蛋超人 292

重写hashcode和equals方法

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

简乐君 7万+

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

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

LarsCheng's Blog 1万+

为什么重写equals()就一定要重写hashCode()方法?

如果涉及使用对象作为key,那么key的对象都必须实现hashCode和equals方法。hashCode和equals方法持续自根类Object,若是你用自定义的类算作key的话,就需要同时覆写equals办法和hashCode方法,因为我们java的集合中判断两个对象是否相等,是根据hashCode和equals这个俩个方法。规则是先判断两个对象的hashCode是否相等,如果不相等,认为两个对

sixingmiyi39473的博客 7838

怎么重写equals()方法和hashCode()方法

equals()

qq_63882368的博客 1696

探索equals()和hashCode()方法

如果你现在还对hashcode了解甚少的话,建议你先看看下面两篇博客,绝对有用,面试中经常问这些。 《java中Map,List与Set的区别》 《05.Hash Tables(哈希表)》 equals()和hashCode()区别? ------------------------------------------------- equals():反映

8168

【Java】Object类中的equals()和hashCode()

= 是用来比较两个对象的引用(内存地址)是否相同,对于基本数据类型比较的是值。equals() 方法是用来比较两个对象的内容是否相equals()同,通常在类中会重写该方法来判断内容的相等。

m0_75260099的博客 1179

Java中equals()、hashCode()与“==“的深度解析

在Java中,==、equals()和hashCode()各有其用途,理解它们的区别和正确实现方式是编写健壮代码的基础。==适用于引用比较,equals()用于内容比较,而hashCode()确保哈希集合的正确性。通过遵循Java的约定、避免常见陷阱并采用最佳实践,开发者可以确保对象比较的可靠性和性能。无论是处理字符串、自定义对象还是集合操作,正确使用这些方法将显著提升代码质量。

持续输出Java相关知识 1649
上一篇: 集合
下一篇: Hash算法和Hash表简述
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值