我開發了一個可以使用哈希集概念的應用程序。我必須重寫hashset中的equals(),hashCode()和toString()方法。我不知道爲什麼要重寫給定的方法。請別人告訴我,如果不重寫上述方法會發生什麼。哈希集覆蓋的方法
Q
哈希集覆蓋的方法
0
A
回答
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;
}
}
我創建了兩個對象Foo1
和Foo2
是在各方面平等的,但我還沒有覆蓋equals()
或hashCode()
。
Foo foo1 = new Foo(10);
Foo foo2 = new Foo(10);
Java將不考慮這些是相等的,即使我可以看到,他們是平等的,因爲我還沒有解釋如何通過重寫equals()
他們進行比較。如果我打印出的hashCode()的值,我會看到已經分配給不同的對象不同的整數值,例如:
foo1 = 1671711
foo2 = 11394033
所以,如果我把它們添加到HashSet
,它會高興地把這兩個對象在那裏,當我真的只希望其中的一個被放進來。
Here是一個類似的問題,關於使用這些方法的面試問題。
相關問題
- 1. 覆蓋哈希
- 2. 覆蓋JSON哈希
- 3. 哈希值覆蓋值
- 4. 內部哈希表覆蓋
- 5. Python3哈希函數覆蓋
- 6. java中的哈希表覆蓋問題
- 7. Java:本地哈希表覆蓋全局哈希表
- 8. 哈希表漏洞(屬性覆蓋)?
- 9. 合併哈希和不覆蓋內
- 10. 哈希方法
- 11. 覆蓋對象列表作爲字段的類的哈希碼方法
- 12. 哈希碼和哈希集的概念
- 13. 覆蓋方法
- 14. 覆蓋方法
- 15. 覆蓋方法
- 16. 覆蓋方法
- 17. 覆蓋'+'方法
- 18. 覆蓋observable/observableArray集合方法
- 19. Java方法覆蓋 - 「方法不會覆蓋超級方法...」
- 20. 安全哈希方法
- 21. 哈希方法和UnicodeEncodeError
- 22. 哈希中間方法
- 23. 類方法,如哈希值
- 24. 哈希圖得到方法
- 25. 密碼哈希方法
- 26. 注射方法從哈希
- 27. 方法從哈希映射
- 28. 新的哈希表條目覆蓋另一個鍵的值 - Java
- 29. 調用從覆蓋方法中覆蓋的方法在OO PHP
- 30. RUBY - 做哈希陣列哈希內的正確方法
你確定你不是在討論重寫hashCode,而是等於你放入該集合的任何類型的元素?說實話,你的問題目前太模糊了。你問我們如果你不覆蓋某些方法會有什麼不同 - 但沒有說明你的壓倒性行爲是什麼!請閱讀http:// tinyurl。com/so-hints –
我認爲喬恩是對的,在這個階段你很困惑,並沒有真正問過一個明確的問題。關於這個東西的好資源是Josh Bloch的Effective Java。第3章與此處相關,實際上可以在線獲取! http://java.sun.com/developer/Books/effectivejava/Chapter3.pdf –
@MarkPeters喬恩是對的?真?我不信! –