java 集合类hashCode 方法与HashSet类

集合类(加强java学习)
hashCode 方法与HashSet类
 ---》有人发明了一种哈希算法来投稿从集合中查找元素的小小
 ,这种方式将集合分成若干个存储区域,每个对象可以计算出一个哈希码
 ,可以将哈希码分组,每组分别对应摸个区域,根据一个对象的哈希码就可以
 确定该对象存储在哪个区域
==========
HashSet就是采用哈希算法存取对象的集合,它内部采用对某个数字n进行取
余的方式对哈希码进行分组和划分对象的存储区域,Object类中定义了一个
hashCode()方法来返回每个Java对象的哈希码,当从HashSet集合中查找某个对象
时,Java系统首先调用对象的hashCode()方法获得该对象的哈希码,然后根据哈希码找到相应的
存储区域,最后取出该存储区域内的每个元素与该对象进行equals方法比较,这样就不用遍历集合的所哟普
元素就可以,得到结论,客家HashSet集合具有很好的对象检索性能,但是,hashSet集合存储队形的效率
相对要低些,因为向HashSet 集合中添加一个对象时,要先计算该对象的哈希码和根基这个
哈希码确定该对象在集合中存放的位置

---------------------------------
为了保证一个类的实例对象能在HashSet正常存储,要求这个类的两个实例对象用
equals()方法比较结果相等时,它们的哈希码也必须相对.也就是说,如果obj1.equals(obj2)的结果为true,
那么一下表达式的结果也要为true;
obj1.hashCode() == obj2.hashCode()
==============================
如果一个类的hashCode()方法没有醉熏上述要七月,那么,当这个类的两个实例对象用equals()方法
比较的结果相等时,它们本来应该无法被同时存储进Set集合中,但是,如果将他们存储进HashSet集合
中,由于它们的hashCode ()的方法返回的值不同,第二个对象首先按哈希码计算可能会被放进与第一个
对象不同的区域中.这样,它就不吭能与第一个对象进行equals方法比较了,也就可能被存储进
hashSet集合中了.Object类的hashCode()方法不能满足对象被存入hashSet中的要求,因为它的返回
值是通过对象的内存地址推算出来的,同一个对象在程序运行期间的任何时候返回的哈希值都是始终不变的,
所以,重要两个不同的实例对象,计算它们的equals方法比较结果相等,它们默认的hashCode方法的返回值是
不同的.
============================
从HashSet集合中删除了对象时,只有类的实例对象要求采用哈希算法存储和检索时,这个类才需要按要求覆盖
hashCode方法,即使程序可能暂时不会用到当前类的hashCode方法,但是为他童工一个hashCode
方法也不会有什么不好,没准以后什么时候有用到这个方法,所以,通常要求hashCode方法和equals犯法一同被覆盖。
------------------------------
======================
提示:
1.通常来说,一个类的两个实例对象用equals()方法比较的结果相等时,它们的哈希码也必须相等,但反之则不成立,即equals
方法比较的结果不相等的对象可以有相同的哈希码或者说哈希码相同的两个随想的equal是方法比较结果可也不相等
2.当一个对象存储进hashSet集合中以后,就不能修改这个对象中的那些参与计算哈希值得字段了,否则,对象修改后的哈希值
与最初存进的hashSet集合中的哈希值就不同,这种情况下,即使在contains方法使用该对象的
当前引用作为参数去HashSet集合中检索对象,也将返回找不到对象的结果,这也会导致无法从HashSet
集合中单独删除当前对象,从而造成内存泄露。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值