Я пытаюсь понять приведенное ниже выполнение LRU. Не удалось выяснить, что:java: Понимание реализации LRU
- Каково использование
addFirst()
. Этот метод вызывается из методаput
иget
. - Как двойной список поможет отслеживать самую старую запись? Все записи фактически находятся на карте, где одна запись не знает о другой.
Эти вопросы могут звучать глупо, но я был бы очень благодарен за объяснение.
Код:
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
public class LRUDLL<K, V> {
private final Map<K, Entry<K,V>> map;
private Entry<K, V> oldest;
private final int lruSize;
public LRUDLL (int lruSize) {
if(lruSize <= 0){
throw new IllegalArgumentException("Size is inappropriate");
}
map = new HashMap<K, Entry<K, V>>();
this.lruSize = lruSize;
}
private static class Entry<K, V> {
Entry<K, V> left;
Entry<K, V> right;
K key;
V value;
Entry(Entry<K, V> left, K key, V value, Entry<K, V> right) {
this.left = left;
this.key = key;
this.value = value;
this.right = right;
}
};
private void addFirst(Entry<K, V> entry) {
remove(entry);
if(oldest == null) {
entry.left = entry.right = entry;
oldest = entry;
} else {
Entry<K, V> tail = entry;
tail.right = entry;
entry.left = tail;
//deal with circulating
oldest.left = entry;
entry.right = oldest;
}
}
private void remove (Entry<K, V> entry) {
assert entry != null;
if(entry.left != null) entry.left.right = entry.right;
if(entry.right != null) entry.right.left = entry.left;
if(entry == oldest) oldest = entry.right;
}
public synchronized void put (K key, V value) {
Entry<K, V> entry = new Entry<K, V>(null, key, value, null);
map.put(key, entry);
addFirst(entry);
if(removeOldestEntry()) {
remove(oldest);
}
}
public synchronized V get(K key) {
Entry<K, V> entry = map.get(key);
if(entry!= null) {
addFirst(entry);
return entry.value;
}
return null;
}
private boolean removeOldestEntry() {
return map.size() > lruSize;
}
}
и речи не глупый человек. не перегружал ли дополнительный метод? –
Нет. Я так не думаю. –