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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张聪珉 中级黑马   /  2013-8-13 22:33  /  1251 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

哥们今天又卡壳了,是Hashset集合的问题,里面判断元素是否唯一通过两个方法来比较的,先比较哈希值,
问题来了:哈希值是对象的地址值吗?还是元素的地址值?这两者有什么区别?我理解的不透侧,请帮忙解释一下
另外,如果哈希值相同,就调用用底层的equals方法进行比较,equals又是怎么比较的?郁闷啊

评分

参与人数 1技术分 +1 收起 理由
薛鹏鹏 + 1

查看全部评分

3 个回复

倒序浏览
哈希值不是地址,而是根据地址来计算出来的,这是Object类的计算方法  哈希算法将任意长度的二进制值映射为固定长度的较小二进制值,这个小的二进制值称为哈希值。哈希值是一段数据唯一且极其紧凑的数值表示形式。如果散列一段明文而且哪怕只更改该段落的一个字母,随后的哈希都将产生不同的值。
那Hashset是如何保证元素唯一性的呢
        是通过元素的两个方法,hashCode和equals来完成
        如果元素的HashCode值相同,才会判断equals是否为true。
        如果元素的hashCode值不同,不会调用equals
而毕老师视频第14天-13集合框架(HashSet存储自定义对象)5分钟-6分钟里面讲的是,因为我们的对象(里面包含两个相同的对象)是通过new创建出来的,那么这两个相同的对象也具备不同的Hash值,所以如果我们要判断元素是否唯一,就要通过我们的判断条件覆盖对象的Hashcode方法,建立对象自己的Hash值,这个不同的对象具备相同的Hash值,只是对象剧本相同的Hash值然后才判断equals,用equals是判断这两个元素是否为同一个元素,如果是,则就打印出来一次。而equals判断的条件比如如果是人的话,就判断他的姓名,年龄是否相同,

评分

参与人数 1技术分 +1 收起 理由
薛鹏鹏 + 1

查看全部评分

回复 使用道具 举报
哈希值不是对象的地址值,也不是元素的地址值,而是根据地址值计算出来的.
HashSet保证元素唯一性,是通过equals方法和hashCode方法来保证的。
                首先判断hashCode()的值是否相同:
  否:直接添加到集合中。 是:继续equals()方法,
                返回值true:说明元素重复,不添加。返回值false:直接添加到集合中

评分

参与人数 1技术分 +1 收起 理由
张智文 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 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值

评分

参与人数 1技术分 +1 收起 理由
张智文 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马