2014-09-06 83 views
2

我正在測試TreeMap的行爲並瞭解排序過程。然而,我仍然困惑的想法是,對於檢索,自定義鍵類需要重寫hashCode方法。說了這麼多,我已經搜索了足夠的谷歌,但找不到任何合理的答案。我們是否需要TreeMap的hashCode實現?

下面是我用過的例子。

class Dog implements Comparable<Dog> { 
    String color; 
    int size; 

Dog(String c, int s) { 
    color = c; 
    size = s; 
} 

int hc; 

@Override 
public int hashCode() { 
    hc = super.hashCode(); 
    return hc; 
} 

@Override 
public int compareTo(Dog o) { 
    return this.color.compareTo(o.color); 
} 
} 

試驗規程試驗樹狀圖..

public class TestHashMap { 
    public static void main(String[] args) { 
     Dog d1 = new Dog("a", 1); 
     Dog d2 = new Dog("b", 2); 
     Dog d3 = new Dog("c", 3); 
     Dog d4 = new Dog("d", 4); 
     Dog d5 = new Dog("e", 5); 

     Dog d = new Dog("c", 3); 

     TreeMap<Dog, Integer> hm = new TreeMap<>(); 
     hm.put(d1, 10); 
     hm.put(d2, 15); 
     hm.put(d3, 5); 
     hm.put(d4, 20); 
     hm.put(d5, 25); 

     System.out.println("value is :" + hm.get(d)); 
    } 
} 

不管我實現hashCode方法或沒有價值的正確檢索,但是在調試時,總是hashCode方法被調用,所以我很困惑如果真的hashCode實現是強制性的。

有沒有人可以幫助理解從TreeMap檢索的正確行爲。

請不要從TreeMap複製粘貼java文檔。

+2

TreeMap絕對不會調用'hashCode' ---除非你通過調用'TreeMap#hashCode()'強制它。 – 2014-09-06 16:14:43

+1

樹不是散列表。沒有必要計算哈希值。 – 2014-09-06 16:15:49

+0

請仔細閱讀TreeMap的文檔。它需要一個實現Comparable接口的類或一個傳遞給它的構造函數的Comparator。它只調用這些接口的實現 – 2014-09-06 16:16:10

回答

3

hashCode()被稱爲默認toString()實現的一部分。既然你還沒有實現你自己的toString(),我懷疑你在你的代碼的某個地方打印了一個Dog,這導致了方法的調用。

+0

打印的'hm.get(d)'是一個Integer ',而不是'狗'。 – NiematojakTomasz 2014-09-06 16:18:49

+0

@Danstahr。 :是的,你是對的我做了同樣的錯誤。 – chaosguru 2014-09-06 16:20:33

+0

@NiematojakTomasz:謝謝你指出這一點。 – Danstahr 2014-09-06 16:30:37

0

我發現這是我的錯誤,我明確地調用了toString()方法中的hashCode(),它造成了這種混淆。

儘管如此,結論是,對於TreeMap,它遵循可比較接口實現,並且不遵循hashCode和equals實現。

+0

也許你的調試器調用'toString()'和'hashCode()'結果呢?我在IntelliJ的調試中運行你的代碼,但是'Dog.hashCode()'中的斷點執行永遠不會停止。或者,也許你運行不同的代碼,比你張貼。 – NiematojakTomasz 2014-09-06 16:29:09

+0

是的發佈的代碼沒有它。這是我的代碼,我錯過了System.out.println複製。 – chaosguru 2014-09-06 16:32:20

+0

然而,請注意,「強烈建議(儘管不要求)自然順序與平等一致。這是因爲排序集合(和排序映射)沒有顯式比較器時,它們與自然排序與equals不一致的元素(或鍵)一起使用時表現得「奇怪」。特別是,這樣一個有序的集合(或有序映射)違反了set(或map)的一般契約,它是用equals方法定義的。---並且,每當你重載equals時,你必須*重寫'hashCode'來匹配。 – 2014-09-06 16:59:30

相關問題