如何在Java中获得具有弱键和标识哈希的ConcurrentHashMap
?我认为Google Guava Collections可以提供这样的东西,但我可以从标准库中获取它吗?我还有其他选择吗?
答案 0 :(得分:10)
我认为Google Guava Collections可以提供这样的功能,但是我可以从标准库中获取它吗?
简短的回答是,否则Java SE没有实现这种特殊的组合。
您可以使用java.util.concurrent.ConcurrentHashMap
密钥实例化WeakReference
,并执行一些额外的工作来实现删除已损坏引用的映射条目,但这不会为您提供标识哈希语义。 / p>
您可以使用java.util.IdentityHashMap
密钥实例化WeakReference
,并执行一些额外的工作来实现删除已损坏引用的映射条目,但这不会为您提供并发行为。
使用java.util.WeakHashMap
不会为您提供并发或身份哈希。
您可以(理论上)将密钥类包装为覆盖自然equals
和hashcode
方法的内容。但这很可能无法使用。
我认为不可能通过覆盖ConcurrentHashMap
或IdentityHashMap
中的方法来实现这一目标。
也许唯一可行的选择是更改基于身份的密钥类equals
和hashcode
方法。但这不适用于“内置”键类型(尤其是final
键)或者在应用程序的其他部分需要基于值的equals / hashcode的情况。
答案 1 :(得分:2)
Google Guava实施似乎是最简单的方法。可以使用new MapMaker().weakKeys().makeMap()
初始化所需的地图,并使用java.util.concurrent.ConcurrentHashMap
。有关详细信息,请参阅apidoc。
答案 2 :(得分:1)
如果您的应用程序在spring框架(版本为gt 3.2)下,则可以考虑使用org.springframework.util.ConcurrentReferenceHashMap
。下面是它的描述:
一个ConcurrentHashMap,它对键和值使用软引用或弱引用。 此类可以用作Collections.synchronizedMap(new WeakHashMap>())的替代方法,以便在并发访问时支持更好的性能。此实现遵循与ConcurrentHashMap相同的设计约束,除了支持空值和空键。
注意:使用引用意味着不能保证放置在地图中的项目随后将可用。垃圾收集器可能会随时丢弃引用,因此似乎有一个未知线程正在静默删除条目。
如果未明确指定,则此实现将使用软条目引用。
答案 3 :(得分:0)
搜索ConcurrentWeakIdentityHashMap,你会得到很多例子。我自己写了一个工具,因为我认为org / ehcache / core / internal / util / ConcurrentWeakIdentityHashMap $ WeakReference的hashCode非常糟糕。
Pull Rquest to fix the ehcache3 ConcurrentWeakIdentityHashMap Key hashCode