黑马程序员技术交流社区

标题: 关于集合的一个问题 [打印本页]

作者: 潘廖明    时间: 2013-3-14 14:36
标题: 关于集合的一个问题
本帖最后由 潘廖明 于 2013-3-15 12:10 编辑

hashCode()方法对于HashSet有什么意义?
作者: 戴乾刚    时间: 2013-3-14 15:30
HashSet不允许元素重复
hashCode方法可以这样理解:它返回的就是根据对象的内存地址换算出的一个值。这样一来,当集合要添加新的元素时,先调用这个元素的hashCode方法,就一下子能定位到它应该放置的物理位置上。如果这个位置上没有元素,它就可以直接存储在这个位置上,不用再进行任何比较了;如果这个位置上已经有元素了,就调用它的equals方法与新元素进行比较,相同的话就不存了,不相同就散列其它的地址。这样一来实际调用equals方法的次数就大大降低了,几乎只需要一两次。
作者: tianyun    时间: 2013-3-14 16:29
HashSet属于集合类,需要存储对象,hashCode()方法决定了对象储存的位置,Set集合类要求数据不能为同一对象,并通过对象的equal方法和hashCode方法判断该元素是否已在集合中。
作者: 马甲大王    时间: 2013-3-14 16:53
前天记的笔记,希望有帮助:
hashCode方法与HashSet类
  集合分成若干个存储区域,每个对象可以计算出一个哈希码。也就是说每个区域的哈希码一样,然后再用equals方法比较两个对象

  HashSet就是采用哈希算法存取对象的集合,他内部采用对某个是数字进行取余的方式对哈希码进行分组和划分对象区域。Object类中定义了一个hashCode()方法返货每个java对象的哈希码,当从HashSet集合中查找某个对象时,Java系统首先调用对象的HashCode()方法获得该对象的哈希码,然后根据哈希码找相应的存储区域,最后取出该区存储域内的每个元素与该对象进行equals方法比较,这样不用遍历集合的所有元素就可以完成比较。

作者: vmvm555    时间: 2013-3-14 19:29
hashCode()是Object类中的一个方法,意思是只要你是一个对象,我就有办法拿到该对象的hashcode值,是通过某个算法将地址值转换过来的,和HashSet的关系是,存储于
HashSet中的元素底层是以hash表实现的数据结构,因为实现了Set接口的集合类不准添加重复元素,所以判断是否为重复元素时就要用到Object中的HashCode方法,首先两个存在于堆内存当中的对象地址值不可能相同,所以hashcode值也不相同,所以要先覆写Object中的hashcode方法,然后再覆写equals方法,当两个对象的hashcode值相同时才去使用equals方法比较对象,所以说为什么要将添加进HashSet集合的元素要在覆写equals方法前要覆写hashcode方法呢,就是因为这样
作者: 潘廖明    时间: 2013-3-14 20:12
戴乾刚 发表于 2013-3-14 15:30
HashSet不允许元素重复
hashCode方法可以这样理解:它返回的就是根据对象的内存地址换算出的一个值。这样一 ...

朋友不是要你解释hashCode( )什么意思,是问你hashCode的存在对于HashSet有什么作用?
作者: 燕国庆    时间: 2013-3-14 20:46
HashSet的底层数据结构是一个哈希表,HashSet不允许元素的重复,这是为什么?其原因就在于它有hashCode方法、和equals方法,这两个方法确保了HashSet集合中的元素不重复,这就是hashCode的存在对于HashSet有着的作用。当向集合中添加元素时后添加的元素就会先后自动调用hashCode、equals这两个方法,其中先调用hashCode方法判断this.这个元素跟集合中先存在的元素的哈希值是否相等,若相等继续进行equals方法的比较,否则就不进行equals方法的比较。equals返回的是布尔型的值,hashCode返回的是整型的。
不知道对你有没有帮助!
作者: HM赵磊    时间: 2013-3-14 22:13
首先明确一点:HashSet,TreeSet都属于Set集合。HashSet的底层使用的数据结构是哈希表,TreeSet底层使用的是二叉树数据结构。对于SET结合,他里面的元素是无序的,也就是说想SET集合中存入对象的顺序和从SET集合中取出的顺序是不一定一致的,这是由于底层使用的数据结构不同。且Set集合中不允许元素存在重复。那么保证他不重复的原因是啥呢?-------两个方法hashCode()和equlas()
1,对于hashCode(),她返回的是对象的哈希值,可以通俗的理解这个哈希值就是对象在内存中的地址。如果两个对象的哈希值相同,那么你说这俩对象相同不相同呢?
2,对于equals()方法,她比较的也是对象的地址值是否相同,但是有时候根据需求,会复写equals方法,让其判断的内容与需求相同,例如在毕老师的视频中认为一个学生的年龄和姓名相同认为是同一个人,复写equals方法,作为第二个判断条件
另:在集合中只要是涉及底层数据结构式哈希表的都要复写hashCode()和equals()这两个方法。如有必要,还会复写toString()方法。谁让他们都是上帝的儿子呢?嘻嘻  

希望能帮到您

作者: HM李超    时间: 2013-3-14 23:17
    思考这个问题先理解hash算法的功能(我自己理解的,不知道准不准):hash算法能保证通过一个对象快速找到另一个对象,hash算法的速度是很快的,能保证查询得到快速的执行。当需要查询集合中某个元素是,hash算法可以根据该元素的值得到该元素保存的位置,从而快速的找到这个元素。打一个比如,就数组吧!数组是一种几乎所有能存储一组元素数据结构中最快的,因为数组中的每个元素都有对应的索引,如果要访问某个元素,只需要提供该元素的索引,该索引能指出该元素在数组内存中的存储位置,索引找到该元素的速度极快。
      实际上,向hashset集合中添加元素时,HashSet会根据该元素的hashCode值来决定它的存储位置----也就是说每个元素的hashCode就是它的“索引”。
      这么说来,我们要快速查找存储一组数据时,可以用数组就可以了。但是呢,数组是有局限性的,一是因为数组元素的索引是连续的,二是数组的长度是固定的,数组一旦被初始化就不能改变其长度。而HashSet就不一样了,HashSet采用每个元素的hashCode作为索引,也可以自由的改变其长度,可以根据hashCode值来访问元素。
       因此,当从HashSet中访问元素时,HashSet先计算该元素hashCode值(hashCode方法的返回值),然后直接到该hashCode对应的位置去取该元素,所以HashSet速度很快,hashCode对于HashSet的意义就是这样的,希望对你有帮助!
作者: 潘廖明    时间: 2013-3-14 23:35
HM李超 发表于 2013-3-14 23:17
思考这个问题先理解hash算法的功能(我自己理解的,不知道准不准):hash算法能保证通过一个对象快速找 ...

这个解释比较合理!
作者: itserious    时间: 2013-3-15 03:48
hashCode()方法对于HashSet有什么意义?

意义:1.HashSet的底层数据结构就是哈希表,要用到hashCode()方法来计算地址值。
      2.  HashSet集合在进行 添加元素,删除元素,判断元素等时候都要去调去hashCode()方法。
      3. 用于hashSet集合迭代元素。




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