黑马程序员技术交流社区

标题: HashSet [打印本页]

作者: 尹兆国    时间: 2014-6-12 17:56
标题: HashSet
本帖最后由 尹兆国 于 2014-6-13 01:40 编辑

  HashSet是如何保证元素的唯一性的啊

作者: wyqs92    时间: 2014-6-12 18:10
首先比较哈希值,如果哈希值相同,就用equals方法判断内容是否相同。
作者: axuan    时间: 2014-6-12 18:16
我的理解:
当HashSet中放入了两个对象后,默认他们的hashCode都是不一样的,因此不需要调用equals方法就能确定这两个对象不是同一个,但是如果这两个对象的值是一样的,这种判断结果就不符合要求了,因此需要重写hashcode方法,将两个对象的hashcode值设为相同,这样就可以进入equals判断阶段,equals方法是继承自object类的,比较的是对象的地址值,所以判断的结果也必定不同,这又不符合要求了,因此也需要重写equals方法。经过改写以上两个方法,可以完成两个对象的比较,只要两个对象的内容(值)相同,就判断为同一个对象,不得重复存储。哈希表就像一个个桶,每个桶都有一个hashcode,只要元素的hashcode相同,equals如果为false,那么这些元素都挂在这个桶里
作者: wojiaojay    时间: 2014-6-12 18:35
就是通过哈希值和equals比较
作者: crazystraw    时间: 2014-6-12 19:31
毕老师视频说的很详细啊
作者: 彭飞    时间: 2014-6-12 20:17
犹然记得,当时毕老师的例子

说有2个人,
一个叫李四,年纪20
一个叫张三,年纪40

李四的哈希值刚好是40,张三的哈希值刚好是20   如此以来,   同为60 ,出现重复

最后老师给出一个*37    还是*27  只要保证不越界。

这是高级软件MyEclipse  生成的, 算法就是严谨的多。

  1.         public int hashCode() {
  2.                 final int prime = 31;
  3.                 int result = 1;
  4.                 result = prime * result + x;
  5.                 result = prime * result + y;
  6.                 return result;
  7.         }
复制代码

作者: 雾里看花。    时间: 2014-6-12 20:54
哈希值     :D
作者: java木    时间: 2014-6-12 20:59
楼主灌水也灌含蓄点可好,嘻嘻我灌水的技术比你好多了
作者: Emperors    时间: 2014-6-12 23:03

底层是使用hash表实现。

它使用元素的equals与hashCode方法来保证HashSet集合元素的唯一性。
存储对象时,先调用对象的hashCode()方法计算一个哈希值,在集合中查找是否有哈希值相同的对象。
如果没有哈希值相同的对象,直接存入。
如果有哈希值相同的对象,则和哈希值相同的对象进行equals()方法比较。
equals()方法比较结果相同则不存,不同就存入。
往HashSet集合里存储的对象必须正确重写hashCode和equals方法
HashSet存储元素效率非常高




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