关于Java中的hashCode()和equals(Object other)

本文深入探讨了Java中HashSet的contains方法的工作原理及其与hashCode和equals方法的关系。通过具体示例展示了如何利用这些方法来高效地检查元素是否存在。

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

最近用Java写程序,发现这两个函数掌握的不好,所以专门看书研究了好久。


“contains方法被重新定义,用来快速查看是否某个元素已经出现在集中。他只在某个桶中查找元素,而不必查看集合中的所有元素。”——《Core Java》


当比较一个集合(Set)中是否含有一个对象的时候,调用contains函数,而contains函数又会调用hashCode快速缩小判断范围,然后再调用equals判断是否含有该对象。

注意:hashCode的值仅代表该对象在散列表中桶的位置,散列表用链表数组实现,每个链表都在一个相同的桶中。所以说,如果hashCode返回值之前没有,那么该对象一定不再集合中,如果hashCode返回之前存在,那再根据equals判断。


如下程序:

import java.util.HashSet;


public class test {

	public static void main(String...arg){
		Node node1 = new Node(12);
		Node node2 = new Node(12);
		open.add(node1);//调用hashCode,发现之前没有,新对象
		open.add(node2);//调用hashCode,发现之前有,再调用equals,发现返回值一样,故判断该对像之前存在,拒绝加入
		Node node3 = new Node(12);
		System.out.println(open.contains(node3));//调用hashCode,发现之前有,再调用equals,发现返回值一样,故返回true表示存在
		System.out.println(node1.equals(node3));//仅仅调用equals方法
	}
	static HashSet<Node> open = new HashSet<Node>();
}


class Node{
	
	public Node(int a){
		this.a = a;
	}
	
	public boolean equals(Object other){
		System.out.println("equals");
		Node otherNode = (Node) other;
		if(this.a == otherNode.a) return true;
		else return false;
	}
	
	public int hashCode(){
		System.out.println("hashCode");
		return a;
	}
	
	int a = 0;
}
/*输出:
 * hashCode
 * hashCode
 * equals
 * hashCode
 * equals
 * true
 * equals
 * true
 */


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值