关于hashcoed()方法

本文深入解析了hashCode()方法的工作原理,探讨了它在散列集合如HashMap、HashSet和HashTable中的应用,以及如何通过重写hashCode()和equals()方法提高查询效率。

hashcode()方法也是Object基类下的方法,和toString(),equals()一样,所有类都可以重写hashcode()方法。hashcode()方法是根据对象的内存地址等对象自身相关信息生成一个hash值。

hashcode()方法主要是配合一些散列集合使用的,比如HashMap,HashSet和HashTable等,当这些散列集合中存储对象时,hash值可以提高查询效率。原理是这样的,查询对象肯定需要一个比对的过程,比对的时候会先去比对hash值,如果hash值不一样,说明肯定不是要找的对象,如果hash值一样,在调用对象的equals()方法比对。因此先比对hash值可以减少equals()方法的调用次数,进而提高效率。因此这儿可以理解一个误区,两个对象hash值是可能一样的,虽然概率比较小,hash值并不是用来确定对象唯一性的,理解这个误区。

因此,两个对象equals()方法相等,则必然是一个对象,他们的hash值也相等。如果两个对象equals()方法不等,则他们是两个对象,但是他们的hash值是有可能相同的。所以有一句话,重写一个方法的equals()方法时候,一定要重写hashcode()方法。因为如果在类中重写了equals()方法使得该类的两个对象判断为相等,但是不重写hashcode()方法的话他们的hash值不一样,那就是两个对象,根本不会去调用equals()方法比较。

可以通过HashMap的get和put理解一下hashcode()方法的作用,这些散列集合中有一个table专门去存集合中对象的hash值。

put方法原理是插入其hashcode()方法生成一个hash值,然后去table中比较,如果hash值不存在即直接插入,如果hash值已经存在,就调用equals方法比较是否为同一对象,是同一对象就不插入,如果不是同一个对象就存在一个hash冲突解决问题。一般是这么解决的,由于他们的hash值相同,即他们在集合中的地址值相同,那么这两个对象会形成一个链表,查询的时候比对hash值相同后,再通过equals()方法从链表中找到该对象,所以如果hash冲突严重会影响查询效率。

get方法的原理就是先调用hashcode()方法拿到这个对象的hash值,然后再去集合中找。

所以同一对象get的hashcode()和put的hashcode()必然一个值,如果要重写hashcode()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值