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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 罗闯 黑马帝   /  2012-3-23 17:00  /  2220 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 罗闯 于 2012-3-23 17:13 编辑

第一:如果往set中增加元素底层会首先判断hashcode是否相同,如果他们的值相同,然后判断equals是否形同,equals比较的是他们是否是同一个对象

疑问一:equals方法比较他们是一个对象的话,如果不是同一个对象的话,那么他们的hashcode方法肯定是不相同的,那么此时直接比较equals方法不就行了,为什么还要多余比较hashcode方法呢?

疑问二:在很多时候为什么hashcode和equals方法要同时重写呢?

评分

参与人数 1技术分 +1 收起 理由
房宝彬 + 1 加油

查看全部评分

9 个回复

正序浏览
equals  值不相等,hashcode值不一定不相同,hash值是通过哈希函数运算得来的,不同的对象可以有相同的哈希值,数据结构里面有相关内容
回复 使用道具 举报
罗闯 黑马帝 2012-3-23 19:02:59
9#
本帖最后由 罗闯 于 2012-3-23 19:04 编辑
陈汉帆 发表于 2012-3-23 18:33
你说反了,比较两个元素是否相等是先判断hashCode,如果hashCode相等再判断equals,因为判断hashCode比判断 ...


大虾正解,吊丝谢过
回复 使用道具 举报
你说反了,比较两个元素是否相等是先判断hashCode,如果hashCode相等再判断equals,因为判断hashCode比判断equals高效的多,hashCode自有一套判断方法
所以如果equals方法判断是相等,但哈希值不一定相等,两个元素也就不一定相等;
因此这就带来了一个问题,hashCode判断和equals判断不同步,所以为了保持同步性,必须对这两个方法进行重写,如:
一个Person类中有name属性和age属性,你把hashCode重写成:
int hashCode(){
    return name.hashCode()+age*37;

这样equals判断如果相同,哈希值也肯定相同,但先判断hashCode速度比equals快很多。不过哈希值相同,也有equals不同的情况,所以要双重判断

评分

参与人数 1技术分 +1 收起 理由
房宝彬 + 1 赞一个!

查看全部评分

回复 使用道具 举报
我自己是这样理解的
对象都有自己的地址,但是地址是唯一的而且不可以更改
所有的对象因为都继承了Object类,所以都有自己的hashCode,而且这个hashCode是可以更改的
假设你需要一个Person的集合对象,但是对象里面包括(id,名称,性别,年龄,国籍,学历,等十项数据)
这时候你在往一个hashSet集合添加的时候,你只需要先比对HashCode值就可以了
当HashCode不同时,数据可以添加,当HashCode相同时,再使用equals的方法比较是否相同,这时候可能涉及的比较就相对复杂了

关于重写HashCode和equals方法问题,首先Object类定义的这两个方法的比较相对简单
所以我们重写HashCode是为了更快的比较要添加对象的不同,(应该是对效率的考虑,这句是我个人观点)
而且对于equals方法,显然我们的数据类型(一般为数字,字符)要比较的是大小,或者字母的排序
一般来说和地址值毫无关系,所以需要重写本对象的equals方法

以上为个人理解{:soso_e113:}
回复 使用道具 举报
hashCode获取的值相当于一个内存分区的代号,在元素超多的情况下,用equals()(一个一个的比)效率相当低,而hashCode()则先找到这个元素所在的分区,在用equals()比较,缩小查找范围,可提高效率
回复 使用道具 举报
一般hashset装入对象时用
回复 使用道具 举报
hashcode和equals方法在集合里保证唯一性的,
回复 使用道具 举报
第二个问题没看明白什么情况下 重写  HashCode 和equals
回复 使用道具 举报
第一:   equals 比较相同的情况下 他们HashCode 不一定相同。  这是肯定的 不信你创建2个Object 类 然后打印他们的  HashCode  肯定不相同。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马