黑马程序员技术交流社区
标题: hashCode与HashSet关系 [打印本页]
作者: zhangyangLengen 时间: 2014-11-14 15:34
标题: hashCode与HashSet关系
2.1:hashCode方法与HashSet类基本的描述
其实引入哈希算法,就为了进行简化查找;提高查找的效率。此方法应用于集合当中。将集合分成若干个存储区域,每个对象可以计算出一个哈希码,可以将哈希码进行分组,每个组对应某个存储区域,根据一个对象的哈希吗就可以确定对象应该存储在哪个区域
HashSet就是采用哈希算法进行存取对象的集合,它内部就是采用对某个数字n进行取余的方式对哈希码进行分组和划分对象的存储区域。Obejct类中定义了一个hashCode()方法来返回每个java对象的哈希码,当从HashSet集合中查找某个对象时,java系统首先调用对象的hashCode()方法获得该对象的哈希码,然后根据哈希码找到对应的存储区域,最后取出该存储区域中的每个元素与该对象进行equals进行比较,不用遍历集合中所有的元素,就可以得到结论;
应用于HashSet类中插入,查找,删除,修改;
注意:
1:只有类的实例对象要被采用哈希算法进行存储和检索时,这个类才需要按要求进行覆盖hashCode方法,及时程序可能暂时不会用到当前了类的hashCode方法,但是为其提供了一个hashCode方法也不是个坏事,所以通常要求进行复写对象中hashCode和equals方法;
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 类中复写hashCode和equals方法,那么进行插入时就会先判断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, 下载次数: 12)
作者: 一叶障目 时间: 2014-11-14 20:58
总结的很好,~_~
作者: 高昌德 时间: 2014-11-15 06:46
很好,,,
作者: 327753899 时间: 2014-11-15 10:07
hashSet是hashCode的一种算法,hashCode是Object中定义了hashCode,并覆盖hashCode方法
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |