Вопрос о реализации LRU Cache в Java - PullRequest
3 голосов
/ 05 августа 2009

Стандартный пример реализации LRU Cache в Java указывает на пример депо url http://www.exampledepot.com/egs/java.util/coll_Cache.html

Как вызывается по умолчанию removeEldestEntry после добавления новой записи в фрагмент кода ниже?

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);

Ответы [ 3 ]

2 голосов
/ 05 августа 2009

По Java API для LinkedHashMap:

Метод removeEldestEntry(Map.Entry) может быть переопределен для наложения политики автоматического удаления устаревших сопоставлений при добавлении новых сопоставлений на карту.

В частности:

Этот метод вызывается put и putAll после вставки новой записи в карту.

Также обратите внимание:

Этот метод обычно не изменяет карту каким-либо образом, вместо этого позволяя карте изменять себя в соответствии с ее возвращаемым значением. Для этого метода разрешено изменять карту напрямую, но если он это делает, он должен возвращать false (указывая, что карта не должна предпринимать дальнейших изменений) Эффект возврата true после изменения карты из этого метода не определен.

1 голос
/ 05 августа 2009

В этом примере LinkedHashMap расширяется «анонимным внутренним классом» .

Метод removeEldestEntry переопределяет версию суперкласса, которая всегда возвращает false (указывая, что старшая запись не должна удаляться). Переопределяющая версия возвращает true, если размер карты превышает ограничение, указывая, что самая старая запись должна быть удалена.

0 голосов
/ 05 августа 2009

В документации класса LinkedHashMap говорится, что он будет вызывать метод removeEldestEntry () в соответствующие моменты времени. В приведенном выше коде мы предоставляем анонимный «extends» класса LinkedHashMap, который явно предоставляет нашу реализацию для этого метода.

...