Java 中有基于软引用的 LinkedHashMap 吗?如果没有,有没有人有我可以重用的代码片段?我保证会正确引用它。
谢谢。
Java 中有基于软引用的 LinkedHashMap 吗?如果没有,有没有人有我可以重用的代码片段?我保证会正确引用它。
谢谢。
WeakHashMap 不保留插入顺序。因此,它不能被视为 LinkedHashMap 的直接替代品。此外,仅当不再可访问该键时才释放映射条目。这可能不是您想要的。
如果您正在寻找的是内存友好的缓存,那么您可以使用这里的简单实现。
package be.citobi.oneshot;
import java.lang.ref.SoftReference;
import java.util.LinkedHashMap;
public class SoftLinkedCache<K, V>
{
private static final long serialVersionUID = -4585400640420886743L;
private final LinkedHashMap<K, SoftReference<V>> map;
public SoftLinkedCache(final int cacheSize)
{
if (cacheSize < 1)
throw new IllegalArgumentException("cache size must be greater than 0");
map = new LinkedHashMap<K, SoftReference<V>>()
{
private static final long serialVersionUID = 5857390063785416719L;
@Override
protected boolean removeEldestEntry(java.util.Map.Entry<K, SoftReference<V>> eldest)
{
return size() > cacheSize;
}
};
}
public synchronized V put(K key, V value)
{
SoftReference<V> previousValueReference = map.put(key, new SoftReference<V>(value));
return previousValueReference != null ? previousValueReference.get() : null;
}
public synchronized V get(K key)
{
SoftReference<V> valueReference = map.get(key);
return valueReference != null ? valueReference.get() : null;
}
}
我见过的最好的想法是包装LinkedHashMap
,这样你put
进入它的所有东西都是一个WeakReference。
更新:刚刚浏览了它的来源WeakHashMap
和它处理一切的方式,WeakReference
同时仍然可以很好地使用泛型是可靠的。这是它使用的核心类签名:
private static class Entry<K,V> extends WeakReference<Object> implements Map.Entry<K,V>
我建议更深入地浏览源代码以获取其他实现想法。
更新 2:kdgregory 在他的评论中提出了一个很好的观点——我的所有建议都是确保 中的引用Map
不会阻止所指对象被垃圾收集。您仍然需要手动清除死引用。
看看这篇文章。它展示了如何实现 SoftHashMap...