2009-11-06 3 views
2

가장 최근에 또는 가장 자주 사용되는 메타 데이터로 항목을 제한하는 정적 크기 해시 테이블의 구현이 있습니까? 나는이 정보를 직접 추적하지 않는 것을 선호한다.자주 사용하는 메타 데이터 해시맵

저는 대부분의 캐싱 구성 요소가이 사실을 기억하고 있지만, 새로운 종속성을 많이 도입하지는 않습니다.

답변

10

당신은 LinkedHashMap를 사용하여 표준 JDK 라이브러리를 사용하여 LRU 캐시를 구축 할 수 있습니다 :

public class MyLRUCache<K, V> extends LinkedHashMap<K, V> { 

    private final int maxEntries; 

    public MyLRUCache(int maxEntries) { 
     // you can be a bit fancy with capacity and load factor 
     super(16, 0.75, true); 
     this.maxEntries = maxEntries; 
    } 

    @Override 
    protected boolean removeEldestEntry(Map.Entry<K, V> eldest) { 
     return size() > maxEntries; 
    } 
} 

당신은뿐만 아니라 WeakReference들과 함께 플레이 할 수 있습니다.

+1

나는 그것을 좋아한다. 나는 전에 그것에 대해 들어 보지 못했다. – monksy

+0

소원 나는 이전에 WeakReferences에 대해 알고 있었다. 이 캐시 메커니즘은 내가 작업 할 때 좀 더 멋지게 만들 것입니다. – monksy

2

사용 LinkedHashMapremoveEldestEntry을 무시하고 대신 장남의 가장 최근에 액세스 한 항목을 제거 accessOrder as true

Accessordered지도를하게 할 수 있습니다 constructor을 사용해야합니다.

모든 쿼리가지도의 구조를 변경하므로 조금 느립니다.

예 :

public AccesOrderedLRUCache<V,K> extends LinkedHashMap<V,K>{ 
    private final m_capacity; 

    public AccesOrderedLRUCache(int capacity) { 
     super(0.75*capacity, 0.75, true); 
     m_capacity = capacity; 
    } 

    @Override 
    protected boolean removeEldestEntry (Map.Entry<K,V> eldest) { 
     return size() > getCapacity(); 
    } 

    public int getCapacity() { 
     return m_capacity; 
    } 
} 
+0

은 jdk 1.6.0_13에 없습니다. http://kickjava.com/src/java/util/LinkedHashMap.java.htm (어느 버전인지 알 수는 없지만 여전히) – Fedearne

+0

@ Fedearne, 감사합니다. 나는 삽입 주문으로 접근 주문을 혼란스럽게 여기고 있습니다. – notnoop

+0

0.75 * 용량은 아마 당신이 의미하는 바가 아닙니다. 실제로 용량 /0.75를 의미한다고 가정합니다. 또한 getCapacity에는 괄호가 없습니다. removeEldestEntry()에서 LRUCache.this.cacheSize에 대한 ref_m_capacity를 선호합니다. –