Java中有SoftHashMap吗?

我知道有一个WeakHashMapin java.util,但是由于它对WeakReference所有东西都使用s,而这仅由this

Map引用,因此被引用的对象将在下一个GC周期丢失。因此,如果您要缓存随机数据,这几乎是没有用的,那么很可能会再次请求而无需在其余时间进行硬链接。最好的解决方案是使用SoftReferences代替的map,但是我在Java

RT Package中找不到。

回答:

编辑(2012年8月):

事实证明,目前最好的解决方案可能是Guava

13.0的Cache类,在Guava的Wiki上进行了解释-

这就是我要使用的。它甚至支持构建一个SoftHashMap(请参阅参考资料CacheBuilder.newBuilder().softKeys()),但这可能不是您想要的,正如Java专家Jeremy

Manson解释的那样(在下面您将找到链接)。


我不知道(2008年11月),但是您可以SoftHashMap在网上找到一些实现。

喜欢这个:SoftHashMap或者这个。


编辑(2009年11月),

正如Matthias在评论中提到的那样,Google

Guava

确实使用了SoftReferences:

一个ConcurrentMap制造商,提供的这些特征的任意组合:

  • 软键或弱键,
  • 软值或弱值,
  • 定时到期,以及
  • 按需计算值。

如该线程中所述,另一个JSR166y候选人:

jsr166y.ConcurrentReferenceHashMap

它为Google实现提供了一个替代的并发参考映射(依赖于后台线程逐出条目)


编辑(2012年8月)

Google实现仅在请求条目的过期时间时才使用后台线程。特别是,它仅使用java.util.Timer,而不像具有单独的后台线程那样具有侵入性。

杰里米·曼森(Jeremy

Manson)建议,对于任何缓存,都应使用此功能以避免SoftReference的危险:http : //jeremymanson.blogspot.de/2009/07/how-

hotspot-decides-to-clear_07.html

Apache

Commons提供了另一种实现,即org.apache.commons.collections.map.ReferenceMap

; 它不支持定时删除,但是它支持选择是按身份还是按相等来比较密钥。此外,此实现不是并发的-可以使其同步,但是在来自多个线程的访问下效果不佳。

以上是 Java中有SoftHashMap吗? 的全部内容, 来源链接: utcz.com/qa/401929.html

回到顶部