Вопрос

Стандартный пример реализации кэша LRU в Java указывает на URL-адрес example depot 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);
Это было полезно?

Решение

В этом примере LinkedHashMap расширяется с помощью " анонимный внутренний класс " .

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

Другие советы

В соответствии с Java API для LinkedHashMap:

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

В частности:

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top