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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 尹兆国 中级黑马   /  2014-6-12 17:56  /  1633 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 尹兆国 于 2014-6-13 01:40 编辑

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

9 个回复

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

说有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.         }
复制代码
回复 使用道具 举报
哈希值     :D
回复 使用道具 举报
java木 来自手机 中级黑马 2014-6-12 20:59:35
8#
楼主灌水也灌含蓄点可好,嘻嘻我灌水的技术比你好多了
回复 使用道具 举报

底层是使用hash表实现。

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

点评

正解  发表于 2014-6-13 01:39
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马