문제

Java에서 LRU 캐시를 구현하기위한 표준 예는 예제 Depot URL을 가리 킵니다.http://www.exampledepot.com/egs/java.util/coll_cache.html

아래 코드 스 니펫에 새 항목 만 추가 한 후 기본적으로 removeLedestentry가 어떻게 호출됩니까?

final int MAX_ENTRIES = 100;
Map cache = new LinkedHashMap(MAX_ENTRIES+1, .75F, true) {
    // This method is called just after a new entry has been added
    public boolean removeEldestEntry(Map.Entry eldest) {
        return size() > MAX_ENTRIES;
    }
};

// Add to cache
Object key = "key";
cache.put(key, object);

// Get object
Object o = cache.get(key);
if (o == null && !cache.containsKey(key)) {
    // Object not in cache. If null is not a possible value in the cache,
    // the call to cache.contains(key) is not needed
}

// If the cache is to be used by multiple threads,
// the cache must be wrapped with code to synchronize the methods
cache = (Map)Collections.synchronizedMap(cache);
도움이 되었습니까?

해결책

이 예에서 LinkedHashMap an과 함께 확장되고 있습니다 "익명의 내부 수업".

그만큼 removeEldestEntry 메소드는 슈퍼 클래스 버전을 재정의하고 있으며 항상 반환됩니다. false (가장 오래된 항목을 제거해서는 안됩니다). 우선 버전이 반환됩니다 true 맵의 크기가 한계를 초과하는 경우 가장 오래된 항목을 제거해야 함을 나타냅니다.

다른 팁

자바 API LinkedHashMap:

그만큼 removeEldestEntry(Map.Entry) 새로운 매핑이 맵에 추가 될 때 오래된 매핑을 자동으로 제거하기위한 정책을 부과하도록 메소드가 무시할 수 있습니다.

구체적으로:

이 방법은 호출됩니다 put 그리고 putAll 지도에 새 항목을 삽입 한 후.

또한 참고 :

이 방법은 일반적으로 맵을 어떠한 방식으로도 수정하지 않고 대신 맵이 리턴 값에 의해 지시 된대로 자체를 수정할 수있게합니다. 이 메소드는 맵을 직접 수정하는 것이 허용되지만 그렇게하면 False를 반환해야합니다 (맵이 더 이상 수정을 시도하지 않아야 함을 나타냅니다). 이 방법 내에서 맵을 수정 한 후 True를 반환하는 효과는 지정되지 않습니다.

LinkedHashMap 클래스 문서는 적절한 시간에 removeEldestEntry () 메소드를 호출한다고 명시합니다. 위의 코드에서 우리는 해당 방법에 대한 구현을 명시 적으로 제공하는 LinkedHashMap 클래스의 익명 "확장"을 제공합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top