[求助]为什么重写equals方法,一定要重写HashCode方法?

Steve_Samuelson 2008-04-20 06:02:32
为什么重写equals方法,一定要重写HashCode方法?
谁能写个程序给小弟解释一下。
...全文
7084 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaoyuqi00 2012-04-11
  • 打赏
  • 举报
回复
学写了!
jingyu323 2011-12-14
  • 打赏
  • 举报
回复
对我有用,学习哈
超大萝卜王 2011-07-15
  • 打赏
  • 举报
回复
学习下
victoryzjs 2011-04-12
  • 打赏
  • 举报
回复
但是如何重写hashcode呢
还需要进一步学习 啊
Warlen 2010-06-17
  • 打赏
  • 举报
回复
谢了!正用上了!
py-th 2009-08-09
  • 打赏
  • 举报
回复
学习了
han00lu 2009-02-01
  • 打赏
  • 举报
回复
学习
panxuan 2008-04-21
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 j_now 的回复:]
这是sun说的,看看Object#equals()和Object#hashCode()的文档,您就会明白了

* Note that it is generally necessary to override the <tt>hashCode </tt>
* method whenever this method is overridden, so as to maintain the
* general contract for the <tt>hashCode </tt> method, which states
* that equal objects must have equal hash codes.

* Returns a hash code value …
[/Quote]
llyzq 2008-04-21
  • 打赏
  • 举报
回复
我昨天看了java编程思想第三版

第十一章 MAP的功能方法 散列算法与散列码 理解hashCode()

那里讲得很详细

如果楼上几位达人的解释不明白,可以去看看
anqini 2008-04-21
  • 打赏
  • 举报
回复
因为equals比较得是两个对象,或者是两个对象的内容,假如两个对象相等那它们两个的hashcode也必须一样,因为hashcode是用对象的内部地址转换成一个整数的。
假如你改写了equals方法而没重写hashcode方法,那就乱套了!就像4楼说得那样!
qjqwqjq 2008-04-21
  • 打赏
  • 举报
回复
public int hashCode()返回该对象的哈希码值。支持该方法是为哈希表提供一些优点,例如,java.util.Hashtable 提供的哈希表。
hashCode 的常规协定是:

在 Java 应用程序执行期间,在同一对象上多次调用 hashCode 方法时,必须一致地返回相同的整数,前提是对象上 equals 比较中所用的信息没有被修改。从某一应用程序的一次执行到同一应用程序的另一次执行,该整数无需保持一致。
如果根据 equals(Object) 方法,两个对象是相等的,那么在两个对象中的每个对象上调用 hashCode 方法都必须生成相同的整数结果。
以下情况不 是必需的:如果根据 equals(java.lang.Object) 方法,两个对象不相等,那么在两个对象中的任一对象上调用 hashCode 方法必定会生成不同的整数结果。但是,程序员应该知道,为不相等的对象生成不同整数结果可以提高哈希表的性能。
实际上,由 Object 类定义的 hashCode 方法确实会针对不同的对象返回不同的整数。(这一般是通过将该对象的内部地址转换成一个整数来实现的,但是 JavaTM 编程语言不需要这种实现技巧。)

public boolean equals(Object obj)指示某个其他对象是否与此对象“相等”。
equals 方法在非空对象引用上实现相等关系:

自反性:对于任何非空引用值 x,x.equals(x) 都应返回 true。
对称性:对于任何非空引用值 x 和 y,当且仅当 y.equals(x) 返回 true 时,x.equals(y) 才应返回 true。
传递性:对于任何非空引用值 x、y 和 z,如果 x.equals(y) 返回 true,并且 y.equals(z) 返回 true,那么 x.equals(z) 应返回 true。
一致性:对于任何非空引用值 x 和 y,多次调用 x.equals(y) 始终返回 true 或始终返回 false,前提是对象上 equals 比较中所用的信息没有被修改。
对于任何非空引用值 x,x.equals(null) 都应返回 false。
Object 类的 equals 方法实现对象上差别可能性最大的相等关系;即,对于任何非空引用值 x 和 y,当且仅当 x 和 y 引用同一个对象时,此方法才返回 true(x == y 具有值 true)。

注意:当此方法被重写时,通常有必要重写 hashCode 方法,以维护 hashCode 方法的常规协定,该协定声明相等对象必须具有相等的哈希码。


参数:
obj - 要与之比较的引用对象。
返回:
如果此对象与 obj 参数相同,则返回 true;否则返回 false。


LZ可以参考下
fxbird 2008-04-21
  • 打赏
  • 举报
回复
已经讲得很详细了
haoxiongok 2008-04-21
  • 打赏
  • 举报
回复
楼主,我帮你顶上去
kaoloveting 2008-04-21
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 steedhorse 的回复:]
主要原因是默认从Object继承来的hashCode是基于对象的ID实现的。
如果你重载了equals,比如说是基于对象的内容实现的,而保留hashCode的实现不变,那么很可能某两个对象明明是“相等”,而hashCode却不一样。
这样,当你用其中的一个作为键保存到hashMap、hasoTable或hashSet中,再以“相等的”找另一个作为键值去查找他们的时候,则根本找不到。
——而这是反直觉的,因为“我要找的就是那个相等的对象,他明明在,我却找不到…
[/Quote]
lispoy 2008-04-20
  • 打赏
  • 举报
回复
学习
zero1111 2008-04-20
  • 打赏
  • 举报
回复
学习!
晨星 2008-04-20
  • 打赏
  • 举报
回复
主要原因是默认从Object继承来的hashCode是基于对象的ID实现的。
如果你重载了equals,比如说是基于对象的内容实现的,而保留hashCode的实现不变,那么很可能某两个对象明明是“相等”,而hashCode却不一样。
这样,当你用其中的一个作为键保存到hashMap、hasoTable或hashSet中,再以“相等的”找另一个作为键值去查找他们的时候,则根本找不到。
——而这是反直觉的,因为“我要找的就是那个相等的对象,他明明在,我却找不到”。
晨星 2008-04-20
  • 打赏
  • 举报
回复
《Effective Java》一书上关门有一个Item来解释这个问题。
NoahT_T 2008-04-20
  • 打赏
  • 举报
回复
http://sutra.javaeye.com/blog/50177
j_now 2008-04-20
  • 打赏
  • 举报
回复
这是sun说的,看看Object#equals()和Object#hashCode()的文档,您就会明白了

* Note that it is generally necessary to override the <tt>hashCode</tt>
* method whenever this method is overridden, so as to maintain the
* general contract for the <tt>hashCode</tt> method, which states
* that equal objects must have equal hash codes.

* Returns a hash code value for the object. This method is
* supported for the benefit of hashtables such as those provided by
* <code>java.util.Hashtable</code>.

也就是说为了使用hashmap/hashtable等基于hashcode集合类能正常工作,做好在两个对象equals时,hashcode也要相等







62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧