2013-03-17 48 views

回答

9

我认为谷歌番石榴集合可以给这样的事情,但我可以从标准库中得到它吗?

简短的回答是没有。Java SE没有实现这个特定的组合。

  • 你可以实例化一个java.util.concurrent.ConcurrentHashMapWeakReference键,并做一些额外的工作来实现去除坏掉的引用映射条目,但不会给你的身份的散列语义。

  • 你可以实例化一个java.util.IdentityHashMapWeakReference键,并做一些额外的工作来实现去除坏掉的引用映射条目,但不会给你并发行为。

  • 使用java.util.WeakHashMap不会给你任何并发或身份散列。

  • 你可能(理论上)将密钥类包装在某些超出自然的方法中。但这很可能是无法使用的。

  • 我认为这不可能通过重写ConcurrentHashMapIdentityHashMap中的方法来实现。


也许是唯一可行的选择是变化的重点班equalshashcode方法基于身份是。但是,这不会为“中建”键类型(特别是那些final)或在您需要在应用程序的其他部分基于数值等于/哈希码的情况下工作。

+0

有关可能的选项有何评论? – 2013-03-17 02:08:46

+1

使用Google Guava。这是一个选项。 (任何不使用它的理由?)或者从头开始编写你自己的实现。番石榴所需地图的 – 2013-03-17 02:09:47

+0

关于业绩,这将是一样的'java.util.concurrent.ConcurrentHashMap'? – 2013-03-17 02:13:57

1

的谷歌番石榴实施似乎走的最简单的方法。可以使用new MapMaker().weakKeys().makeMap()初始化所需的地图,并使用java.util.concurrent.ConcurrentHashMap。有关更多详细信息,请参阅apidoc

+0

这是正确的 - 为什么它被低估?您应该提到,使用弱键会导致键等于用'=='来评估。 – 2017-05-25 22:39:02

0

搜索ConcurrentWeakIdentityHashMap,你会得到很多例子。我自己写了一个工具,因为我认为org/ehcache/core/internal/util/ConcurrentWeakIdentityHashMap $ WeakReference的hashCode太糟糕了。

Example of ehcache3

Example I wrote

Pull Rquest to fix the ehcache3 ConcurrentWeakIdentityHashMap Key hashCode

+0

感谢您的第二个链接。它解决了我的许多问题。像我的AI项目中的魅力一样工作。不得不将类范围和构造函数改为public – Tschallacka 2017-04-26 22:52:51