2013-08-20 34 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这个