2010-03-23 45 views
0

所以我正在學習Java,我試圖理解平等,但我真的不明白它。所以我的問題是:平等是如何工作的? 謝謝Java等於和hashmaps問題

+3

也許你可以詳細說明這個問題,特別是,因爲它似乎圍繞標題中的hashmaps?你是什​​麼意思,它是如何工作的?在什麼情況下? – wsorenson

回答

0

equals方法將比較值的相等性。

的equals方法是在Object類中定義,因此這意味着所有其他類都可以用這個方法來比較它是如何工作的:它首先會檢查它指的是其自身則對象的haschode的,如果這些如果是這樣,它會檢查該對象中的每個字段與您正在映射的對象的字段,爲什麼您可能會問co的haschode可能是相同的,但它仍然可以在字段中包含其他值,但賠率較低,但它需要深入比較。

4

equals是您用來發現兩個給定對象是否相同的方法。對象的等於的默認實現是:如果它們具有完全相同的參考,則它們是相同的。

有時候,你不想要這個。假設你有一個ComplexNumber類,以及兩個值爲1+i的實例。你不希望他們只因爲他們是不同的實例而不平等。實質上,它們表示相同的數字。在這種情況下,您應該重寫equals以確保其行爲符合預期。

HashMaps使用來自equals的信息知道您傳遞的密鑰是否已經存在。

有效的Java書:

當你 覆蓋equals

我還添加到始終覆蓋哈希碼:特別是如果你使用的是一個HashMap =)

散列表也使用hashcode()來更快地搜索關鍵字,並且hashcode()的結果必須與一致210結果。換句話說,如果x.equals(y),那麼x.hashcode() == y.hashcode()(或者你的hashmap可能有未定義的行爲)。你可能會有x和y x.hashcode() == y.hashcode()!x.equals(y)

如果你想要一個更具體的答案,請做出更具體的問題=)。

+0

當覆蓋equals()時,請記住重寫hashcode()。這將同樣給你很多調試麻煩! –

+0

另請參閱:http://stackoverflow.com/questions/27581/overriding-equals-and-hashcode-in-java – TwentyMiles

0

equals()的意思是「有意義的等價物」。它與==不一樣,意思是「這些是同一個對象。」所有的課程均採用equals()方法,不受Object課程的限制。例如,假設你寫一個Car類賣場,型號和所有者:

Car carOne = new Car("Buick", "LeSabre", "John Doe"); 
Car carTwo = carOne; 

這裏,equals()==都將返回true,因爲這兩個引用指向同一輛車。但是,對於

Car carOne = new Car("Buick", "LeSabre", "John Doe"); 
Car carTwo = new Car("Buick", "LeSabre", "John Doe"); 

有兩個不同的對象,所以==返回false。然而,由於這兩輛車都是由John Doe所擁有的別克LeSabres,因此您的equals()應該寫爲true(假設這個例子中沒有人擁有多於一輛相同類型的汽車)。

此外,塞繆爾指出,如果重寫equals(),你也應該重寫hashCode();其原因超出了這個問題的範圍,並在其他地方有詳細記錄。