黑马程序员技术交流社区

标题: 刨根问底儿栏目Hashset [打印本页]

作者: 张聪珉    时间: 2013-8-13 22:33
标题: 刨根问底儿栏目Hashset
哥们今天又卡壳了,是Hashset集合的问题,里面判断元素是否唯一通过两个方法来比较的,先比较哈希值,
问题来了:哈希值是对象的地址值吗?还是元素的地址值?这两者有什么区别?我理解的不透侧,请帮忙解释一下
另外,如果哈希值相同,就调用用底层的equals方法进行比较,equals又是怎么比较的?郁闷啊
作者: a2213502    时间: 2013-8-13 23:12
哈希值不是地址,而是根据地址来计算出来的,这是Object类的计算方法  哈希算法将任意长度的二进制值映射为固定长度的较小二进制值,这个小的二进制值称为哈希值。哈希值是一段数据唯一且极其紧凑的数值表示形式。如果散列一段明文而且哪怕只更改该段落的一个字母,随后的哈希都将产生不同的值。
那Hashset是如何保证元素唯一性的呢
        是通过元素的两个方法,hashCode和equals来完成
        如果元素的HashCode值相同,才会判断equals是否为true。
        如果元素的hashCode值不同,不会调用equals
而毕老师视频第14天-13集合框架(HashSet存储自定义对象)5分钟-6分钟里面讲的是,因为我们的对象(里面包含两个相同的对象)是通过new创建出来的,那么这两个相同的对象也具备不同的Hash值,所以如果我们要判断元素是否唯一,就要通过我们的判断条件覆盖对象的Hashcode方法,建立对象自己的Hash值,这个不同的对象具备相同的Hash值,只是对象剧本相同的Hash值然后才判断equals,用equals是判断这两个元素是否为同一个元素,如果是,则就打印出来一次。而equals判断的条件比如如果是人的话,就判断他的姓名,年龄是否相同,
作者: sunriselzz    时间: 2013-8-13 23:48
哈希值不是对象的地址值,也不是元素的地址值,而是根据地址值计算出来的.
HashSet保证元素唯一性,是通过equals方法和hashCode方法来保证的。
                首先判断hashCode()的值是否相同:
  否:直接添加到集合中。 是:继续equals()方法,
                返回值true:说明元素重复,不添加。返回值false:直接添加到集合中
作者: panningwjr    时间: 2013-8-14 12:26
本帖最后由 panningwjr 于 2013-8-14 12:43 编辑
  1. //        向hashSet集合中装东西时,重写equals方法和hashCode方法非常重要
  2.         public boolean equals(Object obj) {
  3.                 //如果是同一对象则直接返回true
  4.                 if (this == obj) {
  5.                         return true;
  6.                 }
  7. //                根据字节码判断是否是同一对象类型的实例对象
  8.                 if (obj.getClass() == Stuff.class) {
  9.                         Stuff s = (Stuff) obj;
  10. //                        id是该对象的属性,值唯一不重复,也可以是其他属性,关键在唯一
  11.                         return s.id.equals(id);
  12.                 }
  13.                 return false;
  14.         }

  15.         public int hashCode() {
  16.                 // id唯一,根据返回id属性的哈希值
  17.                 return id.hashCode();
  18.         }
复制代码
需要注意两点:1,equals方法和hashCode方法返回值应该一致,如:若equals返回true,则两个对象的hashCode值也应该相等
2,用作equals比较标准的属性,都应该用来计算hashCode值





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