带有弱键和身份哈希的ConcurrentHashMap?

r.v*_*r.v 17 java concurrency weak-references concurrenthashmap

如何ConcurrentHashMap在Java中获得弱密钥和身份哈希?我认为Google Guava Collections可以提供这样的东西,但是我可以从标准库中获取它吗?我还有其他选择吗?

Ste*_*n C 10

我认为Google Guava Collections可以提供这样的东西,但是我可以从标准库中获取它吗?

简而言之,Java SE并未实现这一特定组合.

  • 您可以java.util.concurrent.ConcurrentHashMap使用WeakReference键实例化一个,并执行一些额外的工作来实现删除已损坏引用的映射条目,但这不会为您提供标识哈希语义.

  • 您可以实例化一个java.util.IdentityHashMapWeakReference键,并做一些额外的工作来实现删除已损坏引用的映射条目,但这不会给您带来并发行为.

  • 使用a java.util.WeakHashMap不会给你并发或身份哈希.

  • 你可以(在理论上)将关键类包装成超越自然equalshashcode方法的东西.但这很可能无法使用.

  • 我认为不可能通过覆盖任何一个ConcurrentHashMap或两个方法来做到这一点IdentityHashMap.


也许是唯一可行的办法是改变的关键类equalshashcode方法基于身份是.但这不适用于"内置"键类型(尤其是final那些)或者在应用程序的其他部分需要基于值的equals/hashcode的情况.

  • @Souvik`new MapMaker().weakKeys().makeMap()`.请参阅[apidoc](http://docs.guava-libraries.googlecode.com/git-history/release/javadoc/com/google/common/collect/MapMaker.html).这使用了Guava,并不完全是`java.util.concurrent.ConcurrentHashMap`,但它将是替代品. (3认同)

r.v*_*r.v 5

Google Guava 实现似乎是最简单的方法。我们可以使用 来初始化所需的映射,new MapMaker().weakKeys().makeMap()并像使用 一样使用java.util.concurrent.ConcurrentHashMap。请参阅apidoc了解更多详细信息。