LinkedHashMap实现LRUCache
<h2>LRU</h2>
<ol>
<li>LRU就是把最近最少使用的元素给删除掉;其核心思想是,每次访问一个元素后把这个元素放在列表一端,这样一来最近最少使用的元素自然就被放到列表的另一端。缓存满了的时候就把那最近最少使用的元素remove掉。</li>
<li>我们使用LinkedHashMap来实现LRU算法,因为LinkHashMap的底层是通过双端队列和HashMap实现的;既有列表的属性,又能够像hashMap一样快速访问。</li>
<li>LinkedHashMap默认的元素顺序是put的顺序,但是如果使用带参数的构造函数,那么LinkedHashMap会根据访问顺序来调整内部 顺序。 LinkedHashMap的get()方法除了返回元素之外还可以把被访问的元素放到链表的底端,这样一来每次顶端的元素就是remove的元素。</li>
</ol>
<h2>代码实现</h2>
<pre><code class="language-java">/**
* LinkedHashMap 的构造函数,LinkedHashMap (int initialCapacity, float loadFactor, boolean accessOrder)
* initialCapacity 是初始化容量;loadFactor是加载因子;
* accessOrder false(默认):基于插入顺序, true:基于访问顺序(get一个元素后,这个元素被加到最后,使用了LRU最近最少被使用的调度算法)
*/
public class LRUCache<K,V> {
private final static float LOAD_FACTORY = 0.75f;
private LinkedHashMap<K,V> map;
private int defaultCapacity = 16;
private int cacheSize;
public LRUCache(int cacheSize) {
this.cacheSize = cacheSize;
map = new LinkedHashMap<K,V>(defaultCapacity,LOAD_FACTORY,true) {
@Override
protected boolean removeEldestEntry(Map.Entry<K, V> eldest) {
return size() > cacheSize;
}
};
}
public V get(K key) {
return map.get(key);
}
public void put(K key, V value) {
map.put(key,value);
}
public void clear() {
map.clear();
}
}</code></pre>