다음은 메모리에 최적의 수의 요소를 유지할 수 있도록 구현 한 것입니다.
핵심은 MRU 개체에 대해 LinkedHashMap과 LRU 개체에 WeakHashMap의 조합을 사용하고 있기 때문에 현재 어떤 개체가 사용되고 있는지 추적 할 필요가 없다는 것입니다. 캐시 용량은 GC가 유지할 수있는 MRU 크기에 더한 값 이상입니다. 객체가 MRU에서 떨어져 나올 때마다 GC가 해당 객체를 가질 때까지 LRU로 이동합니다.
public class Cache<K,V> {
final Map<K,V> MRUdata;
final Map<K,V> LRUdata;
public Cache(final int capacity)
{
LRUdata = new WeakHashMap<K, V>();
MRUdata = new LinkedHashMap<K, V>(capacity+1, 1.0f, true) {
protected boolean removeEldestEntry(Map.Entry<K,V> entry)
{
if (this.size() > capacity) {
LRUdata.put(entry.getKey(), entry.getValue());
return true;
}
return false;
};
};
}
public synchronized V tryGet(K key)
{
V value = MRUdata.get(key);
if (value!=null)
return value;
value = LRUdata.get(key);
if (value!=null) {
LRUdata.remove(key);
MRUdata.put(key, value);
}
return value;
}
public synchronized void set(K key, V value)
{
LRUdata.remove(key);
MRUdata.put(key, value);
}
}
@Suporwski 어떻게 문제를 해결 했습니까? – Hunt
@Hunt 나는 커먼즈로부터 LRUMap을 가지고있다 – Juraj
매우 유사한 질문 [여기] (http://stackoverflow.com/q/221525/2032064) – Mifeet