如何獲得一個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. 具有類密鑰的弱哈希映射
- 2. 線程安全的弱密鑰哈希映射
- 3. android無效密鑰哈希。密鑰哈希不匹配任何存儲的密鑰哈希
- 4. 無效的密鑰哈希
- 5. 解密的哈希和加密哈希
- 6. ConcurrentHashMap和哈希表的區別
- 7. 未生成密鑰哈希
- 8. 哈希會話密鑰
- 9. 哈希:測試密鑰
- 10. 哈希表密鑰生成
- 11. 哈希表相同的密鑰具有不同的值....?
- 12. 使用主密鑰和輔助密鑰的Ruby哈希
- 13. JSTL哈希映射和動態密鑰
- 14. 在哈希中交換密鑰和值
- 15. perl使用具有多個密鑰的哈希比較文件
- 16. com.facebook.FacebookAuthorizationException:UnknownError:密鑰哈希不匹配任何存儲的密鑰哈希
- 17. 哈希密碼和身份攻擊 - 最佳實踐
- 18. F#中的哈希鏈接和.net中的弱哈希表
- 19. 密鑰工具沒有產生MD5哈希爲debug.store
- 20. 密鑰散列無效。密鑰哈希不匹配任何存儲的密鑰哈希
- 21. 龐大的密鑰/哈希鍵/哈希標籤在PHP數組
- 22. 如何在哈希值的哈希值基於公共密鑰
- 23. Ruby的哈希使用密鑰值
- 24. 獲得哈希值的密鑰值
- 25. 檢索動態哈希的密鑰
- 26. SHA512哈希算法的密鑰大小
- 27. Facebook Android的sdk密鑰哈希
- 28. 如何禁用身份.net核心的自動哈希密碼
- 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