java - Java中有SoftHashMap吗?

标签 java hashmap weak-references soft-references

我知道 java.util 中有一个 WeakHashMap,但是由于它对所有内容都使用 WeakReference,因此它只被 this 引用Map,被引用的对象会在下一次 GC 循环中丢失。因此,如果您想缓存随机数据,这几乎是没有用的,很可能会再次请求而不会在其余时间进行硬链接(hard link)。最好的解决方案是使用 SoftReference 的 map ,但我在 Java RT 包中没有找到。

最佳答案

编辑(2012 年 8 月):

事实证明,目前最好的解决方案可能是 Guava 13.0 的 Cache 类,解释于 Guava's Wiki - 这就是我要使用的。 它甚至支持构建 SoftHashMap(参见 CacheBuilder.newBuilder().softKeys()),但这可能不是您想要的,正如 Java 专家 Jeremy Manson 解释的那样(如下你会找到链接)。


不是I know of (2008 年 11 月),但是您可以在网上找到一些 SoftHashMap 的实现。

喜欢这个:SoftHashMapthis one .


编辑(2009 年 11 月)
Matthias评论中提到,Google Guava MapMaker确实使用了软引用:

A ConcurrentMap builder, providing any combination of these features:

  • soft or weak keys,
  • 软或弱值,
  • 定时到期,并且
  • 按需计算值。

this thread 中所述,另一个 JSR166y 候选人:

jsr166y.ConcurrentReferenceHashMap

It provides an alternative concurrent reference map to the Google implementation (which relies on a background thread to evict entries)


编辑(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 ;它不支持定时删除,但它支持选择是否应该按身份或相等来比较 key 。此外,这个实现不是并发的——它可以被同步化,但是在来自多个线程的访问下效果不太好。

关于java - Java中有SoftHashMap吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/264582/

相关文章:

java - 子类java中具有相同名称的属性

java - 无法将字符串解析为长

java - 应用与您的设备不兼容。所有设备

data-structures - 用于有效返回哈希表(映射、字典)的前 K 个条目的数据结构

Java - Hashmap检索序列

scala - 如何在 Scala 中按键对字典进行排序?

swift - 快速关闭时 gcd 中的弱 self

java - 如何将int数组转换为int

java - 为什么Java中没有WeakList和WeakSet的实现?

c# - 什么时候应该使用弱引用?