黑马程序员技术交流社区

标题: 描述对象时,为什么最好要复写hashCode()和equals()方法? [打印本页]

作者: anywayDo    时间: 2015-5-4 17:47
标题: 描述对象时,为什么最好要复写hashCode()和equals()方法?
本帖最后由 anywayDo 于 2015-5-4 22:55 编辑

一个类要实现Comparable接口,复写compareTo方法,这个很好理解,让对象具备比较性,在往TreeSet集合中存的时候,具有自然顺序。可是往hashset中存的时候,不都是一个对象一个对象往里添加么,那地址值一定不同呀,为什么还要复写那两个方法?说是可以保证存入对象的唯一性,可是我是觉得不复写,也可以实现,求大神解答。。
作者: 殷俊    时间: 2015-5-4 19:12
hashset里面两个对象重复意味着这两个对象的内容相同、hashcode值也相同。

(1)两个对象A和B内容相同,表示A.equals(B)的值为true。

(不重写的话,默认equals()方法是调用”=="进行判断的,”=="判断的是两个对象的引用是否相同)

(2)如果你不重写hashCode()方法的话,两个对象的hashcode值在默认情况下是不可能相同的。
但是实际上还是会出现hash值相同,但是内容不同的情况,这是由于hash值计算方法的问题,就好比10可以等于5+5,也可以等于3+7,或者4+6;因此,为了避免这种情况,一般都要重写hashCode方法,当然内容相同,hash值必须相同,因此,在重写equals方法时候,就一定要重写hashCode方法,也就是不管哪种情况,两个方法都要重写
作者: zhiweiqi    时间: 2015-5-4 19:17
楼上解释的详细...
作者: anywayDo    时间: 2015-5-4 22:48
殷俊 发表于 2015-5-4 19:12
hashset里面两个对象重复意味着这两个对象的内容相同、hashcode值也相同。

(1)两个对象A和B内容相同,表 ...

良心答主呀。。我的疑问就在于hashCode的实现方法,因为我不知道为什么哈希值会出现一样的情况。。答案很详细,非常感谢。。
作者: anywayDo    时间: 2015-5-4 22:49
zhiweiqi 发表于 2015-5-4 19:17
楼上解释的详细...

是呀,分析的很好,条理很棒 ,要向答主学习。。
作者: yihuihua    时间: 2015-5-4 23:36
学习了!!
作者: fenglinluomu    时间: 2015-5-5 08:54
学习了.
作者: ninjaes    时间: 2015-5-5 09:01
anywayDo 发表于 2015-5-4 22:48
良心答主呀。。我的疑问就在于hashCode的实现方法,因为我不知道为什么哈希值会出现一样的情况。。答案很 ...

很有可能相同的,因为哈希值的计算是根据你的对象来,假设 有可能是你的年龄与名字有一些赋值的公式,很巧的是你的某两个对象里的四个变量数值不一样,但是,带入公式后,计算结果可能是一样。那么,java认为你的两个对象是重复的,set集合就不存了。那你不疯了嘛,所以你自己定义哈希值的计算,方可确保万无一失。。。。。
作者: anywayDo    时间: 2015-5-5 10:29
ninjaes 发表于 2015-5-5 09:01
很有可能相同的,因为哈希值的计算是根据你的对象来,假设 有可能是你的年龄与名字有一些赋值的公式,很 ...

恩恩。。get。。:lol
作者: anywayDo    时间: 2015-5-5 10:33
fenglinluomu 发表于 2015-5-5 08:54
学习了.

共同进步。。
作者: jing3133920    时间: 2015-5-5 10:34
学习了。
作者: anywayDo    时间: 2015-5-5 10:34
yihuihua 发表于 2015-5-4 23:36
学习了!!

互相学习,多请教,多交流哈。。:lol




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