你必須正確地重寫方法equals()方法從Object類
編輯:我認爲,我的第一反應可能是誤解,因爲我不是太精確。所以我決定增加更多的解釋。
爲什麼你必須重寫equals()?那麼,因爲這是一個開發人員決定兩個對象是否相等意味着什麼的領域。大多數情況下參考平等是不夠的。
例如,假設您有一個HashMap,其鍵的類型爲Person。每個人都有姓名和地址。現在,你想使用鍵找到詳細的bean。問題是,您通常無法使用與地圖中相同的參考創建實例。你所做的是創建Person類的另一個實例。顯然,operator ==在這裏不起作用,你必須使用equals()。
但現在,我們來到另一個問題。假設您的收藏非常龐大,並且您想要執行搜索。天真的實現將使用equals()將您的關鍵對象與地圖中的每個實例進行比較。然而,這將是非常廣泛的。這裏是hashCode()。正如其他人所指出的,散列碼是一個不必是唯一的單個數字。重要的要求是每當equals()爲兩個對象賦予true時,hashCode()必須爲它們返回相同的值。反意義並不成立,這是一件好事,因爲散列碼將我們的鍵分成各種桶。我們在單個桶中有少量的Person類實例。當我們執行搜索時,該算法可以立即跳轉到正確的存儲桶,並且現在只對每個實例執行等於。因此,hashCode()的實現必須儘可能均勻地在桶中分配對象。
還有一點。一些集合需要在用作關鍵字的類中正確實現hashCode()方法,這不僅是出於性能原因。這些示例是:HashSet和LinkedHashSet。如果它們不覆蓋hashCode(),那麼默認的對象 hashCode()方法將允許將您可能認爲「有意義的 等於」的多個對象添加到「不允許重複」集合中。
一些使用的hashCode()
- HashSet的藏品
- LinkedHashSet
- HashMap的
看一看Apache的公地這兩個類,可以讓你實現等於()和hashCode()容易
我做了谷歌,但我發現所有的例子從來沒有解釋,你不得不重寫equals方法。 –
@AndroidAddict:那你爲什麼不問這個問題? – 2013-04-17 20:18:01