ConcurrentHashMap具有弱键和身份哈希?


问题内容

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


问题答案:

我认为Google Guava Collections可以提供这种功能,但是我可以从标准库中获取吗?

对此的简短答案是“否”。Java SE没有实现此特定组合。

  • 您可以java.util.concurrent.ConcurrentHashMap使用WeakReference键实例化a ,并做一些额外的工作来实现删除损坏的引用的映射项,但这不会为您提供身份哈希语义。

  • 您可以java.util.IdentityHashMap使用WeakReference键实例化a ,并做一些额外的工作来实现删除损坏的引用的映射项,但这不会给您带来并发的行为。

  • 使用java.util.WeakHashMap不会给您带来并发或身份哈希。

  • 您(理论上)可以将键类包装在某种覆盖自然equalshashcode方法的东西中。但这很可能无法使用。

  • 我认为不可能通过覆盖ConcurrentHashMap或中的方法来做到这一点IdentityHashMap


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