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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黑马-谭皓 初级黑马   /  2012-4-8 18:31  /  2278 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. public int hashCode()
  2.        {
  3.                return name.hashCode()+sum*78;

  4. }
复制代码
这一步操作的作用是什么?

评分

参与人数 1技术分 +1 收起 理由
岳民喜 + 1

查看全部评分

5 个回复

倒序浏览
向hashSet存入的元素,要保证如果两个元素equals相等,hashCode也必须相等。
相同元素计算出来的区间号必须一致,否则没机会见面比较,也就去不掉重复的元素了

评分

参与人数 1技术分 +1 收起 理由
岳民喜 + 1

查看全部评分

回复 使用道具 举报
哈希值是根据对象的内容算出来的一个int值,按照默认,如果2个对象的内容一样或者同一个对象,他们的哈希值是一样的。如果你不要对象默认算出来的哈希值,你可以覆写hashCode方法返回自己想要的哈希值。
如:默认不能把多个内容一样的对象存入set集合中,只能存一个。其中判断对象唯一性的方法,第一个依据就是对象的哈希值,如果集合中存在和该对象哈希值相同的,则进一步调用equas进行比较,如果哈希值不同则可直接添加进集合。如果想在set集合添加多个相同的对象,需要重写hashCode方法,是哈希值不同。

评分

参与人数 1技术分 +1 收起 理由
岳民喜 + 1

查看全部评分

回复 使用道具 举报
HashSet底层数据结构是哈希表,元素是不可以重复的,为了保证元素的唯一性是通过元素的两个方法,hashCode和equals来完成。如果元素的HashCode值相同,就会判断equals是否为true。
如果元素的hashcode值不同,不会调用equals。
return name.hashCode()+sum*78;//这句代码主要是为了确保一些同名的人不会被当做同一个人而不能添加进HashSet中

评分

参与人数 1技术分 +1 收起 理由
岳民喜 + 1

查看全部评分

回复 使用道具 举报
楼上已经说得很明白了,我再补充一点,虚拟机判断对象是否为同一个对象,先看Hash值,如果Hash值相同
再调用equals()方法,但是这样效率不高,所以我们尽量避免Hash值相同。举个例子说,比如人的姓名相同,根据姓名计算的
Hash值就相同,就要再调用equals方法,但是如果我们复写了Hashcode(),return name.hashCode()+sum*78
因为num不同,Hash值就不同了,提高了效率!
回复 使用道具 举报
支持你一下下。。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马