哈工大软件构造-equals()和hashcode()

本文深入探讨Java中equals与hashcode方法的概念与作用,解析两者在对象等价性判断中的区别与联系,以及在散列结构存储中的应用。文章详细讲解了equals与hashcode的重写原则,强调在集合类中正确使用的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

equals()

在java中,等价可以分为两大类:

  1. 引用等价性(==)
    也就是简单粗暴的判断引用的地址是否相同
  2. 对象等价性
    也就是判断两个对象逻辑上是否等价,也分为两种方法:行为等价性及观察等价性。而equals()就是判断对象等价性。

hashcode()

java中对hashcode()的作用:
hashCode()的作用是为了提高在散列结构存储中查找的效率,在线性表中没有作用;只有每个对象的 hash 码尽可能不同才能保证散列的存取性能,事实上 Object 类提供的默认实现确实保证每个对象的 hash 码不同(在对象的内存地址基础上经过特定算法返回一个 hash 码)。
java中对hashcode()的规约:

  • 程序执行期间只要对象 equals 方法比较操作所用到的信息没有被修改,则对这同一个对象无论调用多次 hashCode 方法都必须返回同一个整数。
  • 如果两个对象根据 equals 方法比较是相等的则调用这两个对象中任意一个对象的 hashCode 方法都必须产生同样的整数结果。
  • 如果两个对象根据 equals 方法比较是不相等的,则调用这两个对象中任意一个对象的 hashCode 方法不一定要产生相同的整数结果

hashcode()与==的关系
若 == 返回true,则两边的对象的hashCode()返回值必须相等,若 == 返回false,则两边对象的hashCode()返回值可能相等,也可能不等,因为Java中对象默认的equals()方法就是用==实现的。

equals()和hashcode()

hashcode()说白了就是类的哈希值,那为什么重写equals时要重写hashcode()。
因为在某些元素不可重复的集合类中(如HashMap,HashSet)为了避免每次添加元素时都要进行复杂的equals()比较,所以会先比较hashcode(),当有已存在元素hashcode()相等时才会进行equals()比较,这样就大大提升了效率。
但这也使得当我们重写equals()时,如果不重写hashcode()会导致利用hashcode()的集合类无法正常使用。
注: 下面附一张关于HashMap,HashSet的比较流程
在这里插入图片描述

怎样重写equals()

public boolean equals(Object obj) {
		if(obj==this)
			return true;
		if(obj==null)
			return false;
		//假设我要比较的类为try1
		if(! (obj instanceof try1))
			return false;
		try1 other=(try1)obj;
		//这里填写对于内部rep的比较
		...
		return false;
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值