我想查找關於如何使用自定義對象作爲HashMap的關鍵字或存儲在HashSet中的對象的權威性文檔。將Java HashSet/HashMap自定義對象作爲關鍵字的權威性文檔?
從閱讀各種帖子,我發現你應該重寫自定義對象(例如Overriding equals and hashCode in Java)中的equals()和hashCode()兩個方法。
但是,當我閱讀Oracle/Sun官方Javadocs的HashSet和HashMap時,他們根本沒有提到重寫這些方法。這些說明是否埋在文檔的其他地方?如果是這樣,我可以在哪裏找到它們?
(1)所以說明是間接達成的,對吧? HashSet導致Set,其中提到了Object()中定義的equals()。 (2)如果我使用TreeSet而不是HashSet,我只需要在自定義對象中重寫Comparable(或者爲TreeSet提供一個Comparator),對吧? TreeSet沒有提及equals()或hashCode()。 – stackoverflowuser2010 2013-02-20 00:24:02
「對象」中定義了「equals」和「hashCode」的聯繫人,因爲那是定義這些方法的地方。你應該以一致的方式定義它們,而不管你是否要在'HashSet'中使用它們。讓每個容器爲這些方法定義自己的合同是沒有意義的,因爲任何對象都只能選擇一個實現 - 這意味着所有集合都應該就如何使用這些方法達成一致。 同樣,你對'overriding'的關注是錯位的。你永遠不必重寫任何這些方法 - 只要確保它們的一致性定義。 – BeeOnRope 2013-02-20 00:54:21
@ stackoverflowuser2010他們不是間接的。正如我在答覆中所說的,它們在「Set」和「Map」的文檔中指出。這些是強加限制的界面,所以這就是人們想要看的地方。 HashMap,HashSet,TreeSet只是簡單的實現,而不是指定合約的目的,而是爲了兌現它們。 – entonio 2013-02-20 02:10:40