我想了解下面給出的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;
}
}
毫無疑問是愚蠢的人。沒有你超載addfirst方法? –
沒有。我不這麼認爲。 –