2011-03-04 78 views
5

来自Bert Bates和Kathy Sierra国家的SCJP 6学习指南(其他要求)x.hashCode()!= y.hashCode()要求x .equals(y)== falseJava中的equals()和hashCode()合同

但是Javadoc for Object没有明确提到这样的要求。引用:
如果两个对象根据equals(Object)方法相等,则对这两个对象中的每一个调用hashCode方法必须产生相同的整数结果。

我应该采取什么Javadoc说作为一个重要的含义,如eq - > hc?那么这两个来源之间就不会有冲突。

回答

13

正如z5h所说,这些陈述是等同的。

对于逻辑条件x和y,“x implies y”与“!y implies!x”相同。

“如果是巴士,它是红色的”在逻辑上等同于“如果某物不是红色,那不是公交车。”

这是contraposition

我应该把Javadoc所说的物质含义如eq - > hc。

是的,这正是它说:两个物体equals下等于暗示他们的散列码必须相等。

+0

感谢您的澄清! – prasopes

+8

“如果是公共汽车,它是红色的”你的英语水平如何:-) –

+0

乔恩,你可以给我任何例子,其中HashCode可以是相同的,但对象不相等? – UnKnown

12

这两个语句是等价的。

简而言之:

  1. 如果两个哈希码不同,对象是绝对不同的下等于。
  2. 如果两个哈希码相同,我们不知道。 (但在许多实际情况下,对象将是平等的)。
5

这些陈述之间没有冲突,它们是等价的。

p: x.equals(y) 
q: x.hashCode() == y.hashCode() 
p implies q 
not q implies not p 
2

关于HashMap的基本情况。
1.无论对象类型如何,HashMap都会为每个键生成哈希码。
2.具体而言 - 哈希码将基于键和值(即条目)

实验产生: 考虑一个用户定义的对象(例如SPObject)为HashMap中的密钥; SPObject只有一个参数(名称)。请参阅:http://www.programcreek.com/2011/07/java-equals-and-hashcode-contract/

如果hashCode()和equals()在SPObject类中写入不正确,则问题如下。
放入2个条目 - 新的SPObject(“SP”)&新的SPObject(“SP”)。这些被视为不同的对象,并成功地存储在地图中。

map.get(new SPObject(“SP”))将返回null。
map.contains(new SPObject(“SP”))将返回false。

这是结果,如果hashCode /等于合同处理不当。

hashCode()  | equals() | Treated as | Description
No    |  No  | Duplicate | Stored in different buckets. 
              | Treated as different object. 

Yes   |  No  | Duplicate | Stored in same bucket. 
              | Treated as different object. 
              | Because, the default(Object) equals method will check only the reference of objects.  

No    |  Yes  | Duplicate | Stored in different buckets.Treated as different object 

Yes(hashlogic) |  Yes  | Unique  | Stored in same bucket.Treated as same object.Efficient. 

Yes(constant) |  Yes  | Unique  | Stored in same bucket.Treated as same object. 
              | Inefficient, because it will iterate bucket elements for equality check. 

+0

很好的解释! – anandaravindan

0

背后hashCode的基本想法是,哪知道对象已经报告了什么其他某些对象有权假定对象是不相等的不同的哈希码值,而不必检查他们的任何一个实体进一步。因为整数支持与等价有关的各种公理,所以实体可能知道两个哈希码不同,而不直接比较它们。例如,知道其中一个报告了偶数,另一个是奇数就足以证明他们不匹配。这样的假设通常允许实体快速识别大部分不可能包含正在查找的对象的集合,因此不会打扰检查这些区域。

关于hashCode和equals的两个引用“要求”都包括一个未说明的前提:在X.equals(Y)报告为真的情况下,人们不希望实体错误地认为它是假的。一般来说,代码对错误假设采取行动是非常糟糕的,所以前提是人们不希望实体对对象平等做出不正确的假设是合理的。 “学习指南”引用这样一个事实:如果两个对象具有不相同的哈希码,则它们将被推定为不相等;使这种推定匹配现实需要他们不等。 JavaDoc基本上暗指这样一个事实,即如果两个对象是相等的,并且要避免让实体假定它们不会并且没有注意到它们,则必须确保由一个返回的值也将被返回另一个。

相关问题