Вопрос о реализации кэша LRU в Java
Вопрос
Стандартный пример реализации кэша 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, который явно предоставляет нашу реализацию для этого метода. Р>