如何獲得一個ConcurrentHashMap
在Java中的弱密鑰和身份哈希?我認爲Google Guava Collections可以提供這樣的功能,但是我可以從標準庫中獲得嗎?我還有什麼其他選擇?具有弱密鑰和身份哈希的ConcurrentHashMap?
回答
我認爲谷歌番石榴集合可以給這樣的事情,但我可以從標準庫中得到它嗎?
簡短的回答是沒有。Java SE沒有實現這個特定的組合。
你可以實例化一個
java.util.concurrent.ConcurrentHashMap
與WeakReference
鍵,並做一些額外的工作來實現去除壞掉的引用映射條目,但不會給你的身份的散列語義。你可以實例化一個
java.util.IdentityHashMap
與WeakReference
鍵,並做一些額外的工作來實現去除壞掉的引用映射條目,但不會給你併發行爲。使用
java.util.WeakHashMap
不會給你任何併發或身份散列。你可能(理論上)將密鑰類包裝在某些超出自然的方法中。但這很可能是無法使用的。
我認爲這不可能通過重寫
ConcurrentHashMap
或IdentityHashMap
中的方法來實現。
也許是唯一可行的選擇是變化的重點班equals
和hashcode
方法基於身份是。但是,這不會爲「中建」鍵類型(特別是那些final
)或在您需要在應用程序的其他部分基於數值等於/哈希碼的情況下工作。
的谷歌番石榴實施似乎走的最簡單的方法。可以使用new MapMaker().weakKeys().makeMap()
初始化所需的地圖,並使用java.util.concurrent.ConcurrentHashMap
。有關更多詳細信息,請參閱apidoc。
這是正確的 - 爲什麼它被低估?您應該提到,使用弱鍵會導致鍵等於用'=='來評估。 – 2017-05-25 22:39:02
搜索ConcurrentWeakIdentityHashMap,你會得到很多例子。我自己寫了一個工具,因爲我認爲org/ehcache/core/internal/util/ConcurrentWeakIdentityHashMap $ WeakReference的hashCode太糟糕了。
Pull Rquest to fix the ehcache3 ConcurrentWeakIdentityHashMap Key hashCode
感謝您的第二個鏈接。它解決了我的許多問題。像我的AI項目中的魅力一樣工作。不得不將類範圍和構造函數改爲public – Tschallacka 2017-04-26 22:52:51
- 1. android無效密鑰哈希。密鑰哈希不匹配任何存儲的密鑰哈希
- 2. 哈希表密鑰生成
- 3. 哈希會話密鑰
- 4. 哈希表相同的密鑰具有不同的值....?
- 5. JSTL哈希映射和動態密鑰
- 6. perl使用具有多個密鑰的哈希比較文件
- 7. F#中的哈希鏈接和.net中的弱哈希表
- 8. 密鑰工具沒有產生MD5哈希爲debug.store
- 9. 檢索動態哈希的密鑰
- 10. 獲得哈希值的密鑰值
- 11. 紅寶石合併哈希陣列基於密鑰,哈希另一個密鑰的總和值
- 12. 如何禁用身份.net核心的自動哈希密碼
- 13. 身份哈希映射的使用
- 14. 如何使用哈希中的密鑰創建一個新的哈希值,其中每個密鑰的值都是密鑰本身?
- 15. HashMap密鑰哈希碼可能失敗?
- 16. 從密鑰在Ruby哈希訪問值
- 17. 哈希默認值取決於密鑰
- 18. 紅寶石性能:多密鑰哈希
- 19. JavaScript附加密鑰:值對哈希
- 20. 如何創建Facebook密鑰哈希?
- 21. 刪除密鑰/ val哈希對留下密鑰。爲什麼?
- 22. 密鑰哈希錯誤無效,即使密鑰匹配
- 23. Android Sha1哈希用戶名和密碼沒有正確哈希
- 24. 如何從哈希中刪除具有銀行值的密鑰,同時跳過第一個密鑰
- 25. ASP.NET的密碼哈希和密碼鹽
- 26. 密碼salting和哈希asp.net?
- 27. 打印哈希的哈希值的兩個不同的密鑰在Perl
- 28. 春季安全數據庫身份驗證瓦特/休眠和哈希密碼?
- 29. 哈希表/插入一個新的密鑰和值
- 30. 哈希表中的弱引用
有關可能的選項有何評論? – 2013-03-17 02:08:46
使用Google Guava。這是一個選項。 (任何不使用它的理由?)或者從頭開始編寫你自己的實現。番石榴所需地圖的 – 2013-03-17 02:09:47
關於業績,這將是一樣的'java.util.concurrent.ConcurrentHashMap'? – 2013-03-17 02:13:57