黑马程序员技术交流社区

标题: 集合的问题 [打印本页]

作者: 咸明月    时间: 2012-7-14 11:14
标题: 集合的问题
hashCode方法对于HashSet的作用是什么
作者: 李思静    时间: 2012-7-14 11:19
因为set集合中,每个对象都必须是不一样的,因此必须要保证对象的唯一性。所以每个对象的hashcode必须不一样,HashCode()方法就是要生成不一样的hashcode,进行散列,方便查找,比较。
作者: 陈欢    时间: 2012-7-14 11:21
在存放集合这种数据的时候,我们可以选择List和Set两种形式,当然,Java当中它们不是具体的实现类.我们可以使用具体的实现类进行数据的存储.
但是List和Set的最显著区别,应该是,List可以放置相同的元素,Set只能放置不同的元素.也就是说Set里面的元素具有唯一性.

当然ArrayList和LinkedList也只是具体的实现形式不同了.我们也可以实现一个ArraySet或LinkedSet.但是.我们会发现一个比较严重的问题.就是.当我们向ArraySet(或LinkedSet)里面添加元素的时候,我们要逐个比较里面的所有已有元素.这样,当集合中数量非常多的时候,比较次数也会直线上升

为了更快捷的检索数据,我们才引进了hashCode的概念,每个Set里面的元素都会有一个hashCode的值,我们可以按照hashCode的值来存储集合里面的元素.如果要检索集合里面是否存在要添加的元素,只要先将该元素的hashCode值算出来,再到相应的位置进行查找,就可以了.对于相同hashCode的不同元素,我们把这个位置,按照链表的形式进行存放.这样,就可以很大程度上减少比较的次数.


作者: 孙飞    时间: 2012-7-14 11:22
HashSet的底层数据结构是哈希表,HashSet通过元素的hashCode和equals来保证元素的唯一性,如果元素的hashCode值相同,会再判断equals是否为true,如果元素的hashCode值不同,则不用调用equals方法
作者: 樊佰轩    时间: 2012-7-14 11:57
hashCode指明了hashSet集合中的数据的唯一性,采用的hash表存储方式。在使用判断两个数据是否相同时,先判断hashCode是否相同,如果相同再判断equals是否相同。
作者: 侯茂绵    时间: 2012-7-15 10:57
   表面上看来,HashSet集合里面的元素都是没有索引的,实际上当程序向HashSet集合中添加元素的时候,HashSet集合会根据这个元素的HashCode值来决定他的存储位置--这个就是说,每个元素的hashCode就是他的"索引";
为什么不直接使用数组呢,还需要使用HashSet呢?,因为数组元素的索引是连续的 ,而且数组的长度是固定的,无法自由增加数组的长度,而且HashSet就不一样了,HashSet来根据每个元素HashCode作为索引,从而自由增加了HashSet的长度,并可以根据元素的HashCode值来访问元素,所以,从HashSet中访问元素的时候,HashSet先计算元素的HashCode值(也就是调用这个对象的HashCode()方法的返回值),安徽直接到这个HashCode对于的位置去取出这个元素---这就是HashSet集合速度很快的原因

作者: 朱烈葵    时间: 2012-7-15 11:08
hashCode是hashSet集合用来判断两个元素是否为同一个元素的方法,如果hashCode值相同,再次使用equals来判断元素是否相同,所以一般对象,如果想用hashSet来存储元素,一般需要复写hashCode和equals方法,简单来说,hashCode是hashSet保证元素的唯一性的方法之一。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2