2011-10-17 91 views
0

我開發了一個可以使用哈希集概念的應用程序。我必須重寫hashset中的equals(),hashCode()和toString()方法。我不知道爲什麼要重寫給定的方法。請別人告訴我,如果不重寫上述方法會發生什麼。哈希集覆蓋的方法

+2

你確定你不是在討論重寫hashCode,而是等於你放入該集合的任何類型的元素?說實話,你的問題目前太模糊了。你問我們如果你不覆蓋某些方法會有什麼不同 - 但沒有說明你的壓倒性行爲是什麼!請閱讀http:// tinyurl。com/so-hints –

+0

我認爲喬恩是對的,在這個階段你很困惑,並沒有真正問過一個明確的問題。關於這個東西的好資源是Josh Bloch的Effective Java。第3章與此處相關,實際上可以在線獲取! http://java.sun.com/developer/Books/effectivejava/Chapter3.pdf –

+0

@MarkPeters喬恩是對的?真?我不信! –

回答

1

例如閱讀: http://www.javamex.com/tutorials/collections/hash_code_equals.shtml

有很多關於討論在其他地方的主題(我推薦Effective Java的書)。

你不需要重寫toString(),這是獎金。

基本上,如果您不覆蓋等於,您將無法按照預期方式從集合中獲取事物。例如。如果你的String類沒有以有意義的方式實現equals,那麼collection.get(「abc」)和collection.get(new String(「abc」))會給你不同的結果。

0

如何

public class MyHashSet<E> extends HashSet<E> { 
    @Override public int hashCode() { ... } 
    @Override public String toString() { ... } 
    @Override public boolean equals(Object o) { ... } 
} 

同樣的方法適用於對象要在HashSet的存儲

public class MyObject { 
    @Override public int hashCode() { ... } 
    @Override public String toString() { return "MyObject"; } 
    @Override public boolean equals(Object o) { return this.equals(o); } 
} 

// Sample usage 
HashSet<MyObject> set = ... 
set.add(new MyObject()); 
0

假設你希望覆蓋將要使用的對象,在HashSet,而不是在HashSet本身的方法,這樣做的原因是,你會從把對象在HashSet得到預期的結果。 hashCode()尤其對HashSet的正常功能至關重要,正如equals()。覆蓋toString()的主要原因是您將得到一些對該對象有意義的表示,而不是該方法的默認版本Object

本質上,如果您不覆蓋這些方法,HashSet將不會達到您所期望的。例如,假設我有一個類Foo,我沒有覆蓋這些方法。

public class Foo { 
    private int number; 

    public Foo(int newNumber) { 
     number = newNumber; 
    } 

    public int getNumber() { 
     return number; 
    } 
} 

我創建了兩個對象Foo1Foo2是在各方面平等的,但我還沒有覆蓋equals()hashCode()

Foo foo1 = new Foo(10); 
Foo foo2 = new Foo(10); 

Java將不考慮這些是相等的,即使我可以看到,他們是平等的,因爲我還沒有解釋如何通過重寫equals()他們進行比較。如果我打印出的hashCode()的值,我會看到已經分配給不同的對象不同的整數值,例如:

foo1 = 1671711 
foo2 = 11394033 

所以,如果我把它們添加到HashSet,它會高興地把這兩個對象在那裏,當我真的只希望其中的一個被放進來。

Here是一個類似的問題,關於使用這些方法的面試問題。