2013-03-17 51 views

回答

9

我認爲谷歌番石榴集合可以給這樣的事情,但我可以從標準庫中得到它嗎?

簡短的回答是沒有。Java SE沒有實現這個特定的組合。

  • 你可以實例化一個java.util.concurrent.ConcurrentHashMapWeakReference鍵,並做一些額外的工作來實現去除壞掉的引用映射條目,但不會給你的身份的散列語義。

  • 你可以實例化一個java.util.IdentityHashMapWeakReference鍵,並做一些額外的工作來實現去除壞掉的引用映射條目,但不會給你併發行爲。

  • 使用java.util.WeakHashMap不會給你任何併發或身份散列。

  • 你可能(理論上)將密鑰類包裝在某些超出自然的方法中。但這很可能是無法使用的。

  • 我認爲這不可能通過重寫ConcurrentHashMapIdentityHashMap中的方法來實現。


也許是唯一可行的選擇是變化的重點班equalshashcode方法基於身份是。但是,這不會爲「中建」鍵類型(特別是那些final)或在您需要在應用程序的其他部分基於數值等於/哈希碼的情況下工作。

+0

有關可能的選項有何評論? – 2013-03-17 02:08:46

+1

使用Google Guava。這是一個選項。 (任何不使用它的理由?)或者從頭開始編寫你自己的實現。番石榴所需地圖的 – 2013-03-17 02:09:47

+0

關於業績,這將是一樣的'java.util.concurrent.ConcurrentHashMap'? – 2013-03-17 02:13:57

1

的谷歌番石榴實施似乎走的最簡單的方法。可以使用new MapMaker().weakKeys().makeMap()初始化所需的地圖,並使用java.util.concurrent.ConcurrentHashMap。有關更多詳細信息,請參閱apidoc

+0

這是正確的 - 爲什麼它被低估?您應該提到,使用弱鍵會導致鍵等於用'=='來評估。 – 2017-05-25 22:39:02

0

搜索ConcurrentWeakIdentityHashMap,你會得到很多例子。我自己寫了一個工具,因爲我認爲org/ehcache/core/internal/util/ConcurrentWeakIdentityHashMap $ WeakReference的hashCode太糟糕了。

Example of ehcache3

Example I wrote

Pull Rquest to fix the ehcache3 ConcurrentWeakIdentityHashMap Key hashCode

+0

感謝您的第二個鏈接。它解決了我的許多問題。像我的AI項目中的魅力一樣工作。不得不將類範圍和構造函數改爲public – Tschallacka 2017-04-26 22:52:51