黑马程序员技术交流社区
标题:
关于equals方法和hashcode()方法的疑问
[打印本页]
作者:
罗闯
时间:
2012-3-23 17:00
标题:
关于equals方法和hashcode()方法的疑问
本帖最后由 罗闯 于 2012-3-23 17:13 编辑
第一:如果往set中增加元素底层会首先判断hashcode是否相同,如果他们的值相同,然后判断equals是否形同,equals比较的是他们是否是同一个对象
疑问一:equals方法比较他们是一个对象的话,如果不是同一个对象的话,那么他们的hashcode方法肯定是不相同的,那么此时直接比较equals方法不就行了,为什么还要多余比较hashcode方法呢?
疑问二:在很多时候为什么hashcode和equals方法要同时重写呢?
作者:
刘元霄
时间:
2012-3-23 17:04
第一: equals 比较相同的情况下 他们HashCode 不一定相同。 这是肯定的 不信你创建2个Object 类 然后打印他们的 HashCode 肯定不相同。
作者:
刘元霄
时间:
2012-3-23 17:06
第二个问题没看明白什么情况下 重写 HashCode 和equals
作者:
王思兰
时间:
2012-3-23 17:13
hashcode和equals方法在集合里保证唯一性的,
作者:
liumeng
时间:
2012-3-23 17:36
一般hashset装入对象时用
作者:
周建
时间:
2012-3-23 18:08
hashCode获取的值相当于一个内存分区的代号,在元素超多的情况下,用equals()(一个一个的比)效率相当低,而hashCode()则先找到这个元素所在的分区,在用equals()比较,缩小查找范围,可提高效率
作者:
李晓旭
时间:
2012-3-23 18:15
我自己是这样理解的
对象都有自己的地址,但是地址是唯一的而且不可以更改
所有的对象因为都继承了Object类,所以都有自己的hashCode,而且这个hashCode是可以更改的
假设你需要一个Person的集合对象,但是对象里面包括(id,名称,性别,年龄,国籍,学历,等十项数据)
这时候你在往一个hashSet集合添加的时候,你只需要先比对HashCode值就可以了
当HashCode不同时,数据可以添加,当HashCode相同时,再使用equals的方法比较是否相同,这时候可能涉及的比较就相对复杂了
关于重写HashCode和equals方法问题,首先Object类定义的这两个方法的比较相对简单
所以我们重写HashCode是为了更快的比较要添加对象的不同,(应该是对效率的考虑,这句是我个人观点)
而且对于equals方法,显然我们的数据类型(一般为数字,字符)要比较的是大小,或者字母的排序
一般来说和地址值毫无关系,所以需要重写本对象的equals方法
以上为个人理解{:soso_e113:}
作者:
陈汉帆
时间:
2012-3-23 18:33
你说反了,比较两个元素是否相等是先判断hashCode,如果hashCode相等再判断equals,因为判断hashCode比判断equals高效的多,hashCode自有一套判断方法
所以如果equals方法判断是相等,但哈希值不一定相等,两个元素也就不一定相等;
因此这就带来了一个问题,hashCode判断和equals判断不同步,所以为了保持同步性,必须对这两个方法进行重写,如:
一个Person类中有name属性和age属性,你把hashCode重写成:
int hashCode(){
return name.hashCode()+age*37;
}
这样equals判断如果相同,哈希值也肯定相同,但先判断hashCode速度比equals快很多。不过哈希值相同,也有equals不同的情况,所以要双重判断
作者:
罗闯
时间:
2012-3-23 19:02
本帖最后由 罗闯 于 2012-3-23 19:04 编辑
陈汉帆 发表于 2012-3-23 18:33
你说反了,比较两个元素是否相等是先判断hashCode,如果hashCode相等再判断equals,因为判断hashCode比判断 ...
大虾正解,吊丝谢过
作者:
张开开
时间:
2012-3-23 19:10
equals 值不相等,hashcode值不一定不相同,hash值是通过哈希函数运算得来的,不同的对象可以有相同的哈希值,数据结构里面有相关内容
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2