文档

java体系技术文档


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&lt;K,V&gt; { private final static float LOAD_FACTORY = 0.75f; private LinkedHashMap&lt;K,V&gt; map; private int defaultCapacity = 16; private int cacheSize; public LRUCache(int cacheSize) { this.cacheSize = cacheSize; map = new LinkedHashMap&lt;K,V&gt;(defaultCapacity,LOAD_FACTORY,true) { @Override protected boolean removeEldestEntry(Map.Entry&lt;K, V&gt; eldest) { return size() &gt; 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>

页面列表

ITEM_HTML