簡體   English   中英

Java中的equals()和hashCode()協定

[英]equals() and hashCode() contract in Java

Bert Bates和Kathy Sierra的SCJP 6學習指南在第554頁中指出(除其他要求外) x.hashCode()!= y.hashCode()要求x.equals(y)== false

但是Javadoc for Object並未明確提及此類要求。 引用:
如果根據equals(Object)方法,兩個對象相等,則在兩個對象中的每個對象上調用hashCode方法必須產生相同的整數結果。

我是否應該將Javadoc所說的作為實質含義,例如eq-> hc 這樣,這兩個來源之間就不會有沖突。

這兩個語句是等效的。

簡單地說:

  1. 如果兩個哈希碼不同,則相等條件下的對象肯定不同。
  2. 如果兩個哈希碼相同,我們就不知道。 (但在許多實際情況下,對象將相等)。

正如z5h所說,這些語句是等效的。

對於邏輯條件x和y,“ x表示y”與“!y表示!x”相同。

從邏輯上講,“如果某物是公共汽車,則為紅色”等同於“如果某物不是紅色,則其不是公共汽車”。

這是對立的

我是否應該將Javadoc所說的作為實質含義,例如eq-> hc。

是的,這正是它的意思:兩個對象在equalsequals意味着它們的哈希碼必須相等。

這些語句之間沒有沖突,它們是等效的。

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

關於HashMap的基本事實。
1. HashMap將為每個鍵生成哈希碼,而與對象類型無關。
2.具體來說-將根據鍵和值(即條目)生成哈希碼

實驗:假設用戶定義的對象(例如SPObject)是哈希映射的鍵; SPObject中只有一個參數( name )。 請參閱: http//www.programcreek.com/2011/07/java-equals-and-hashcode-contract/

如果沒有在SPObject類中正確編寫hashCode()和equals(),則會出現以下問題。
放入2個條目-新的SPObject(“ SP”)和新的SPObject(“ SP”)。 這些被視為不同的對象,並成功存儲在Map中。

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

如果沒有正確處理hashCode / equals合同,則結果是這樣。

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.

hashCode背后的基本思想是,知道某個對象報告的hashCode值與某個其他對象有權獲得的哈希值不同的實體會假定這些對象不相等,而無需進一步檢查它們。 因為整數支持與等效性有關的各種公理,所以實體可能會知道兩個哈希碼不同而無需直接比較它們。 例如,知道其中一個報告了一個偶數,而另一個報告了一個奇數,就足以表明它們不匹配。 這樣的假設通常使實體能夠快速識別出可能無法包含正在查找的對象的大部分集合,從而不必費心檢查這些區域。

引用的有關hashCode和equals的“要求”都包含一個未聲明的前提:在X.equals(Y)報告為true的情況下,人們不希望實體錯誤地將其假定為false。 通常,代碼根據錯誤的假設行事是非常糟糕的,因此前提是,我們不希望實體對對象的相等性做出錯誤的假設是合理的。 《學習指南》引用了以下事實:如果兩個對象的哈希碼不相等,則假定它們不相等。 做這樣的假設符合實際需要,他們不平等的。 JavaDoc本質上暗示着這樣一個事實,即如果兩個對象相等,並且一個人要避免讓實體認為它們不會成為實體並且沒有注意到它們是實體,則必須確保一個人返回的hashCode值也將被返回。另一個。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM