A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© zhangyangLengen 中级黑马   /  2014-11-14 15:34  /  1170 人查看  /  3 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

2.1hashCode方法与HashSet类基本的描述
其实引入哈希算法,就为了进行简化查找;提高查找的效率。此方法应用于集合当中。将集合分成若干个存储区域,每个对象可以计算出一个哈希码,可以将哈希码进行分组,每个组对应某个存储区域,根据一个对象的哈希吗就可以确定对象应该存储在哪个区域
HashSet就是采用哈希算法进行存取对象的集合,它内部就是采用对某个数字n进行取余的方式对哈希码进行分组和划分对象的存储区域。Obejct类中定义了一个hashCode()方法来返回每个java对象的哈希码,当从HashSet集合中查找某个对象时,java系统首先调用对象的hashCode()方法获得该对象的哈希码,然后根据哈希码找到对应的存储区域,最后取出该存储区域中的每个元素与该对象进行equals进行比较,不用遍历集合中所有的元素,就可以得到结论;
应用于HashSet类中插入,查找,删除,修改;
注意:
1只有类的实例对象要被采用哈希算法进行存储和检索时,这个类才需要按要求进行覆盖hashCode方法,及时程序可能暂时不会用到当前了类的hashCode方法,但是为其提供了一个hashCode方法也不是个坏事,所以通常要求进行复写对象中hashCodeequals方法;
2:通常来说,一个类的两个实例对象用equals方法比较结果相等时,他们的哈希码也必须相等,但反之不成立,即:equals方法比较不相等的实例但是可以有相同的哈希码,或者可以说哈希码相同的两个对象的equals方法可以不相等。例如字符串”BB”和“Aa”的equals方法比较结果肯定不相等,但是hashCode方法返回的值却相等;
3当一个对象被存储到hashSet集合中以后,就不能修改这个对象中参与计算哈希值的字段了,否则。对象修改后的哈希值与最初存储进HashSet集合中的哈希值就不同了。在这种情况下,即使在cotains方法中使用该对象的当前引用作为参数去HashSet集合中检索对象,也将返回找不到对象的结果。这也会导致无法从HashSet集合中单独删除当前的对象,造成内存的泄露。
代码:
Collection collections=new HashSet();
                                   ReflectPoint pt1=new ReflectPoint(3,3);
                                     //System.out.println(pt1.hashCode());
                                   ReflectPoint pt2=new ReflectPoint(3,3);
                                   //System.out.println(pt2.hashCode());
                                  ReflectPoint pt3=new ReflectPoint(5,5);
                                  //System.out.println(pt3.hashCode());
                                 ReflectPoint pt4=new ReflectPoint(6,6);
                                                                 //System.out.println(pt4.hashCode());
                              collections.add(pt1);
                              collections.add(pt2);
                              collections.add(pt3);
                                collections.add(pt4);
                               collections.add(pt1);
                                       
解析:
如果ReflectPoint 类中复写hashCodeequals方法,那么进行插入时就会先判断hashCode值,如果相等,就继续判断equals方法,是否相等,如果相等,就不进行插入值,如果不能,就插入。
                             //pt1.y=6;
//collections.remove(pt1);
解析:
如果在该元素成功插入HashSet集合中,如果其过程中进行修改了该元素参与运算hashCode的元素的字段的值,那么导致最后进行删除该引用的值时,就删除不掉了,因为hashCode值变化了;
A�32(5�� �� ont-weight:bold; font-size:10.5000pt; font-family:'Consolas'; " >


11.png (6.32 KB, 下载次数: 16)

11.png

评分

参与人数 1技术分 +1 收起 理由
杨佳名 + 1 赞一个!

查看全部评分

3 个回复

倒序浏览
总结的很好,~_~
回复 使用道具 举报
很好,,,
回复 使用道具 举报
hashSet是hashCode的一种算法,hashCode是Object中定义了hashCode,并覆盖hashCode方法
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马