2012-06-06 52 views
0

我創建了一個類Person(正如本書所說)來保存從鍵盤輸入的人的名字和姓氏,然後還有另一個類PhoneNumber,它將國家代碼,地區代碼和人數封裝爲串。
此人旨在用作Hashmap中的鍵。
類別BookEntry封裝了PersonPhoneNumber。很多BookEntry對象組成了一個表示電話簿的HashMap。什麼時候包括什麼?

Person implements Comparable<Person>所以它包含CompareTo(Person)方法。後來該書增加了equals(Object anotherPerson)方法。
我的問題是,是不是CompareTo方法足以比較兩個鍵?還是說HashMap的內部機制要求我包含equals()方法來比較兩個鍵?
的compareTo()

public int compareTo(Person person) { 
    int result = lastName.compareTo(person.lastName); 
    return result==0? firstName.compareTo(person.firstName):result; 
} 

equals()方法

public boolean equals(Object anotherPerson){ 
    return compareTo((Person)person)==0; 
} 
+1

「equals()」的參數不一定總是一個Person或它的子類。 –

+1

你的'equals()'實現不完整。您必須檢查參數對象是否實際上是'Person'類型。 – adranale

+0

我知道。如果我傳遞'String',程序崩潰:) –

回答

1

compareTo()方法在排序中,

此方法的實現將決定誰是更大(較小,下同)兩人之間,也在什麼程度

equals() & hashcode()將在基於散列數據結構(HashMap中)在你的情況下使用

用戶定義的類作爲HashMap中的一個關鍵

是的,你需要實現hashcode()equals()正確

請參見

+0

所以基本上,如果我使用用戶定義的類作爲鍵,那麼它必須**有一個「equals()」和一個「compareTo()方法被內部機制使用,如果我正確地得到它:) –

+0

_user定義的類作爲key_ of'HashMap'是的,你需要正確地指明hashcode()和equals()' –

+0

你不一定有一個equals()方法。默認情況下,equals只是將==用於相等性,對於大量情況來說這很好。 – Polygnome

2

一些數據結構會使用compareTo(例如TreeMap)和一些將使用equals(例如HashMap)。

更重要的是,它強烈建議compareToequals是一致的,在解釋Comparator javadoc

強烈建議,但並不嚴格要求(則x.compareTo(Y)== 0 )==(x.equals(y))。一般來說,任何實現了Comparable接口並違反這個條件的類都應該清楚地表明這個事實。推薦的語言是「注意:這個類的自然排序與equals不一致。「

另一個提示,在TreeMap javadoc(重點煤礦)發現:

注意,排序由一棵樹映射維護,像任何排序的映射,以及明確的比較是否被提供,如果此有序映射要正確實現Map接口必須與equals一致。

最後,如果重寫equals你也應該重寫hashcode以防止在使用基於散列的結構時發生意外行爲。

+0

所以如果我不知道哪個數據結構使用什麼,我可以使用兩者的組合,就像在我的情況下一樣:) –

+1

@FasihKhatib是的,如果你的類實現了'Comparable',最好的做法是用你的'compareTo'實現重寫'equals'和'hashcode'。它可以幫助您在稍後再次抓到錯誤。但是如果這是你的問題,你的類**不需要實現'Comparable' **來用於'HashMap'。 – assylias

+0

我會記住你的建議。 :) –

1

HashMap使用equals()而不是compareTo(),所以你必須實現它。 TreeMap使用compareTo()

+0

但'equals()'工作,我需要'compareTo()'。現在有意義:) –

+2

不,你不一定需要'compareTo()'爲'HashMap'。你需要'equals'和'hashCode'是一致的。就這些。 –

+0

好的,所以比較的代碼將包含在equals()方法中。 –

相關問題