如何获得一个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