Java中有SoftHashMap吗?

tig*_*ger 63 java weak-references hashmap soft-references

我知道有一个WeakHashMapin java.util,但由于它只使用了WeakReferences,只有这个Map引用,引用的对象将在下一个GC循环中丢失.因此,如果您想要缓存随机数据,这几乎是无用的,这很可能会再次被请求而不会在其余时间进行硬链接.最好的解决方案是使用SoftReferences代替的地图,但我没有在Java RT Package中找到一个.

Von*_*onC 29

编辑(2012年8月):

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


不是我所知道的(2008年11月),但你SoftHashMap在网上找到了一些实现.

喜欢这个:SoftHashMap或者这个.


编辑(2009年11月)
正如Matthias在评论中提到的那样,Google Guava MapMaker确实使用了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 ; 它不支持定时删除,但它确实支持选择是通过标识还是通过相等来比较密钥.此外,此实现不是并发的 - 它可以进行同步,但在多线程访问时效果不佳.


Gil*_*ili 20

我熟悉两个提供SoftHashMap实现的库:

  1. Apache Commons:org.apache.commons.collections.map.ReferenceMap

  2. Google Collections:com.google.common.collect.ReferenceMap

  • ReferenceMap已从Google Collections中删除.立即使用MapMaker. (3认同)