equals() ,hashcode() 使用

本文详细解析了Java中的equals()和hashCode()方法的重要性及其在Map应用中的作用,通过实例展示了常见错误及解决方案,并深入探讨了hashCode()方法在Map中的关键作用。

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

原文 Java equals() and hashCode() Contract

java-hashcode

在java父类Object中定义了2个重要的方法

public boolean equals(Object obj)
public int hashCode()

理解这两个方法非常重要,尤其是用户自定义的类型用在Map中作key,然而,即使高级开发者有时也无法正确使用它们。下面通过一个常见的错误作例子来说明它们是如何工作的。


1,常见错误

import java.util.HashMap;
 
public class Apple {
	private String color;
 
	public Apple(String color) {
		this.color = color;
	}
 
	public boolean equals(Object obj) {
		if (!(obj instanceof Apple))
			return false;	
		if (obj == this)
			return true;
		return this.color.equals(((Apple) obj).color);
	}
 
	public static void main(String[] args) {
		Apple a1 = new Apple("green");
		Apple a2 = new Apple("red");
 
		//hashMap stores apple type and its quantity
		HashMap<Apple, Integer> m = new HashMap<Apple, Integer>();
		m.put(a1, 10);
		m.put(a2, 20);
		System.out.println(m.get(new Apple("green")));
	}
}

在该例中,一个green apple object已添加到HashMap中,当要从中取出该对象对应的value时,该对象却没有被找到。上面的程序返回的是null。


2,由hashCode()导致的问题


问题是由于没有重写hashCode()方法导致的,equaels()和hashCode()的关系是这样的:

1),如果2个对象的相同的,那它们的hashCode一定相同

2),如果2个对象的hashCode相同,那它们可能相同也可能不相同


使用Map的本意是为了比线性查找更快的找到一个对象。用hashcode定位一个对象分2步。在Map内部存储对象用了一个二维数组,第一维数组的index即是key的hashcode值,用该index定位到第二维数组,在第二维数组中用equaels()方法线性查找是否存在某对象。


Object中hashCode()的默认实现是不同对象返回不同的integer值,上面例子中即使是同样类型,不同对象的hashcode也不同。


hashcode就像是用于存储一系列的仓库,不同的物品存放在不同的仓库中,如果可以将同一仓库中的不同物品分配一个唯一的位置,那就更有效率了。所以,正确分发hashcode值更重要。


上例的解决方案即是重写hashCode(),这里用String的长度作演示。

public int hashCode(){
	return this.color.length();	
}




参考文档1


---------------2015.5.10-----------------

另一篇文章Java hashCode() 和 equals()的若干问题解答对equals和hashCode讲解得更清楚

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值