Java中的软引用LinkedHashMap?

Java中是否存在基于softreference的LinkedHashMap? 如果不是,有没有人得到我可以重用的代码片段? 我保证能正确引用它。

谢谢。

WeakHashMap不保留插入顺序。 因此,它不能被视为LinkedHashMap的直接替代品。 此外,仅当密钥不再可访问时才会释放映射条目。 这可能不是你想要的。

如果你正在寻找的是一个内存友好的缓存,这是一个你可以使用的天真实现。

package be.citobi.oneshot; import java.lang.ref.SoftReference; import java.util.LinkedHashMap; public class SoftLinkedCache { private static final long serialVersionUID = -4585400640420886743L; private final LinkedHashMap> map; public SoftLinkedCache(final int cacheSize) { if (cacheSize < 1) throw new IllegalArgumentException("cache size must be greater than 0"); map = new LinkedHashMap>() { private static final long serialVersionUID = 5857390063785416719L; @Override protected boolean removeEldestEntry(java.util.Map.Entry> eldest) { return size() > cacheSize; } }; } public synchronized V put(K key, V value) { SoftReference previousValueReference = map.put(key, new SoftReference(value)); return previousValueReference != null ? previousValueReference.get() : null; } public synchronized V get(K key) { SoftReference valueReference = map.get(key); return valueReference != null ? valueReference.get() : null; } } 

我见过的最好的想法是包装LinkedHashMap这样你put它的所有东西都是WeakReference 。

更新:刚刚浏览了WeakHashMap的源代码,以及它处理WeakReference的方式,同时仍然可以很好地使用generics。 这是它使用的核心类签名:

 private static class Entry extends WeakReference implements Map.Entry 

我建议更深入地浏览源代码以了解其他实现方法。

更新2:kdgregory在他的评论中提出了一个很好的观点 – 我的所有建议都是确保Map的引用不会使指示物不被垃圾收集。 您仍然需要手动清除死引用。

看看这篇文章 。 它显示了如何实现SoftHashMap …