4

Javaにsoftreferenceベースの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、すべてがWeakReferenceputになるようにラップすることです。

更新:ソースを閲覧しただけで、ジェネリックスでうまく遊んで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 に答える