当前位置:  开发笔记 > 编程语言 > 正文

Java中有SoftHashMap吗?

如何解决《Java中有SoftHashMap吗?》经验,为你挑选了2个好方法。

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



1> VonC..:

编辑(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 ; 它不支持定时删除,但它确实支持选择是通过标识还是通过相等来比较密钥.此外,此实现不是并发的 - 它可以进行同步,但在多线程访问时效果不佳.



2> Gili..:

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

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

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


ReferenceMap已从Google Collections中删除.立即使用MapMaker.
推荐阅读
TXCWB_523
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有