2013-08-20 73 views
1

我想構建一個快速的LRU緩存。 這種解決方案是一種很好的方法嗎? 那麼同步呢?LRU在java中快速實現的最佳方法

有一個名爲removeEldestEntry的受保護方法。當項目被添加到地圖時調用此方法。默認實現只是返回false。但我可以子類LinkedHashMap並重寫此方法來檢查是否已達到最大大小,然後只返回true。 LinkedHashMap將通過鏈接列表找到最舊的條目,並在添加新條目之前對其進行引導。

public class MyLRUMap<K,V> extends LinkedHashMap<K,V> { 
private int maxCapacity; 

public MyLRUMap(int initialCapacity, float loadFactor, int maxCapacity) { 
super(initialCapacity, loadFactor, true); 
this.maxCapacity = maxCapacity; 
} 

@Override 
protected boolean removeEldestEntry(Entry<K,V> eldest) { 
return size() >= this.maxCapacity; 
} 
} 

感謝

回答

2

這是推薦的方式做到這一點,儘管它可能是最好做size() > this.maxCapacity代替>=

+1

是不是b因爲在插入新元素之後調用removeEldest方法? 如果我做> =,我的地圖將維持maxCapacity -1的大小? –

+1

正確,根據Javadoc,removedEldest被稱爲AFTER put()和putAll() – dkatzel

0

這實現在本書的「Java泛型和集合」 here提到

2

我想推薦guava/cachebuilder這個