具有软引用值的HashMap实现

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了具有软引用值的HashMap实现相关的知识,希望对你有一定的参考价值。

我想要一个带有键映射到相当大的对象的Map。由于地图将用作缓存,我想通过软链接(java.lang.ref.SoftReference)引用值/条目以在纯内存上清除它。但在这种情况下,我需要有自己的computeIfAbsent()方法实现。

我可以通过以下方式实现它:

Map<Integer, SoftReference<T>> myMap = new HashMap<>();

public T get(Integer key) {
    SoftReference<T> value = myMap.get(key);
    if (value == null || value.get() == null) {
        value = new SoftReference(retrieveValue());
        myMap.put(key, value);
    }
    return value.get();
}

只是想知道,这样的地图有没有开箱即用的解决方案,比如java.util.WeakHashMap

谢谢!

答案

是的,Guava的CacheBuilder支持SoftReference和WeakReference值,以及基于大小和时间的其他驱逐策略。您可以直接使用缓存,也可以将其视为地图:

ConcurrentMap<Integer, V> map = CacheBuilder.newBuilder()
   .softValues()
   .build()
   .asMap()

以上是关于具有软引用值的HashMap实现的主要内容,如果未能解决你的问题,请参考以下文章

具有弱值的 HashMap

集合总结:WeakHashMap + 强/软/弱/虚引用

Java - 更新 HashMap 值的最佳方式 - 传递值/引用相关

具有空键和空值的 HashMap

java的四种引用,强弱软虚

java 强弱软虚 四种引用,以及用到的场景