2009-08-04 3 views
3

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

Как 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); 
+0

Спасибо за ответы !, Так что это анонимный внутренний класс, я пропустил. – Satish

ответ

1

В этом примере LinkedHashMap распространяется на "anonymous inner class".

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

2

Пер с Java API for LinkedHashMap:

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

В частности:

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

Также отметим:

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

+0

Я хотел сказать это! –

+0

Он будет выполнен, но ничего не сделает; вам нужно расширить LinkedHashMap, как я опишу в своем ответе. – erickson

+1

Вопрос * был *: «Как отключается удалениеEldestEntry по умолчанию ..." –

0

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

Смежные вопросы