JavaにsoftreferenceベースのLinkedHashMapはありますか? いいえの場合、おそらく再利用できるコードのスニペットを誰かが持っていますか? 正しく参照することを約束します。
ありがとう。
Javaにsoftreferenceベースの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
、すべてがWeakReferenceput
になるようにラップすることです。
更新:ソースを閲覧しただけで、ジェネリックスでうまく遊んでWeakHashMap
いる間、すべてを処理する方法はしっかりしています。WeakReference
使用するコアクラスのシグネチャは次のとおりです。
private static class Entry<K,V> extends WeakReference<Object> implements Map.Entry<K,V>
他の実装のアイデアについては、ソースをさらに詳しく参照することをお勧めします。
更新2:kdgregoryは彼のコメントで良い点を挙げています-私の提案はすべて、Map
の参照が指示対象がガベージコレクションされるのを妨げないようにすることです。それでも、デッドリファレンスを手動でクリーンアップする必要があります。
この投稿を見てください。SoftHashMap を実装する方法を示しています...