4

Java 中有基于软引用的 LinkedHashMap 吗?如果没有,有没有人有我可以重用的代码片段?我保证会正确引用它。

谢谢。

4

3 回答 3

6

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;
    }
}
于 2009-05-14T12:03:15.870 回答
3

我见过的最好的想法是包装LinkedHashMap,这样你put进入它的所有东西都是一个WeakReference

更新:刚刚浏览了它的来源WeakHashMap和它处理一切的方式,WeakReference同时仍然可以很好地使用泛型是可靠的。这是它使用的核心类签名:

private static class Entry<K,V> extends WeakReference<Object> implements Map.Entry<K,V>

我建议更深入地浏览源代码以获取其他实现想法。

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

于 2009-05-14T10:45:41.953 回答
2

看看这篇文章。它展示了如何实现 SoftHashMap...

于 2009-05-14T13:43:10.497 回答