2013-01-15 43 views
-1

您好我有這樣一類叫做記憶以下一個HashSet:在一個HashSet返回一個對象在Java中

Set<Idea> ideas = new HashSet<Idea>(); 

通用型「理念」是另一個類我寫的有hashCode()方法和equals ()重寫。 我希望能夠在HashSet想法中獲得(而不是移除)Idea對象,然後通過向其添加某些內容來更改它,可能會更改它的hashcode()返回值。我聽說這是行不通的,但沒有人解釋爲什麼。我想知道是否有人能告訴我如何最有效地做到這一點。

+0

HashSet = HashMap 你可以從jdk源看到這個 – farmer1992

+0

我不明白,會用一個HashMap來解決我的問題。如果是這樣,怎麼樣?謝謝! –

+0

@ farmer1992他想要一套不是地圖 – OscarRyz

回答

1

如果你想要執行查找,你應該使用一個Map。如果你想改變這個鍵(或者一個Set的元素),你必須先刪除它並重新添加它。出於這個原因,你的鑰匙應該只有不可變的字段。

1

它不會工作,因爲哈希碼是找到對象的關鍵,如果您以這種方式修改對象,那麼您將更改它的哈希碼,您將無法再找到它。

這就像字典中的條目,如果你改變它,你不會再找到它。這有意義嗎?

+0

因此,找到Idea對象,移除Idea對象,更改Idea對象,然後將Idea對象添加回HashSet的最佳方法是? –

+0

您仍然可以讓它保留在那裏授予hashCode不會更改 – OscarRyz

+1

如果您想更改hashCode,您有兩個選項,可以是您提到的那個,刪除它並再次添加它,也可以使用另一個不實現的Set實現在hashCode方法 – OscarRyz

2

HashSet在內部使用HasMap,其值與key相同。爲了將對象放置到Hashset中,jvm fill首先計算對象的哈希碼,並根據該哈希碼選擇相應的桶並放置對象。如果您是在將對象放入哈希集之後更改哈希碼,您將無法正確地獲取其位置。因此,如果您確實想要移除該元素,則最好從哈希集中移除該對象,然後將其更改並重新放回