2010-08-05 70 views
1

我遇到了一個關於平等和hashCode合同問題: 這裏是等於和hashCode

考慮:

class SortOf { 
    String name; 
    int bal; 
    String code; 
    short rate; 
    public int hashCode() { 
    return (code.length() * bal); 
    } 
    public boolean equals(Object o) { 
    // insert code here 
    } 
} 

以下哪項將履行了equals()和hashCode()合同對於這個 類? (選擇所有適用)。

正確答案 C:

return ((SortOf)o).code.length() * ((SortOf)o).bal == this.code.length() * 
    this.bal; 

d:

return ((SortOf)o).code.length() * ((SortOf)o).bal * ((SortOf)o).rate == 
    this.code.length() * this.bal * this.rate; 

我有一個最後的選擇d的問題,說如果兩個對象

A:code.length = 10,bal = 10,rate = 100

B:code.length = 1 0,bal = 100,rate = 10

然後在D中使用equals()方法,我們得到A.equals(B)求值爲true對不對?但是,他們得到一個不同的hashCode,因爲他們有不同的餘額?是不是我誤解了這個概念?有人能爲我澄清這一點嗎?

回答

4

你說得對 - D會因此而不合適。

更一般地說,hashCodeequals基本上應該考慮相同的領域,以相同的方式。這是一個非常奇怪的實現,當然 - 您通常應該檢查每個涉及領域之間的平等。在少數情況下,字段之間可能會相互關聯以允許乘法等,但我不希望涉及字符串長度...

經常讓人困惑的重要一點是它對於不相等的對象有相同的哈希碼;您突出顯示的情況(具有不同哈希碼的相同對象),這是不可接受的。

0

您必須至少檢查.hashCode()所使用的所有字段,以便相同的對象具有相同的散列。但是你可以在equals中檢查更多的字段,它完全正確地使用相同的散列表有不同的對象。看來你在做SCJP 1.6?這個主題在Katherine Sierra和Bert Bates的SCJP 1.6書中有很好的介紹。

注:這就是爲什麼它的合法實施的有用.equals()而從.hashCode()

+0

感謝您的幫助,我想我明白了。 是的,我正在使用該書來研究scjp,並從考試模擬器中獲得了這個問題。 – y62wang 2010-08-05 06:35:32

+0

您也可以在Josh Bloch的Effective Java第二版中閱讀本主題。非常好的解釋! – 2010-08-05 06:44:00

+0

<3有效的java ... – atamanroman 2010-08-05 06:46:29

0

返回一個恆定值,它是所有關於履行合同(就這個問題而言)。不同的實現(hasCode和equal)具有不同的限制和自身的優勢 - 所以開發人員可以檢查它。

但他們得到不同的hashCode,因爲他們有不同的平衡?
正是!但這就是爲什麼你應該選擇選項C.這個問題想測試你對的執行情況,以履行合同概念而不是哪個hascode會更好。

更多澄清:
你需要經常檢查的事情是: hashCode()實現應該使用相同的實例變量中equals()方法使用。

下面這些實例變量:code.length()bal中使用的hashCode(),因此你被限制在equals()使用這些相同的變量也是如此。 (除非你可以編輯hashCode()實現並將rate添加到它)

-1

通常,如果在類中重寫另一個,則應該總是覆蓋一個。如果你不這樣做,你可能會發現自己陷入困境時,該類用於hashmaps/hashtables等。

+2

問題不是「我應該重寫嗎?」,而是關於它們的實現。這回答了一個不同的問題。 – 2014-07-18 08:51:22

+0

對不起菜鳥的錯誤 – user3774979 2014-07-19 07:14:20