LRU就是Least recently used,最近最少使用,若是空間不足淘汰掉最近最少使用的數據。
實現方式能夠有一下三種:java
實現原理:
一、插入:插入數據是最新的數據,直接插入到鏈表尾部
二、查找:查找到的數據移動到鏈表尾部,表明最新訪問。
三、刪除:鏈表頭表明最近最少使用,若是鏈表滿,則刪除鏈表頭數據算法
時間複雜度:O(n)ide
一、前後插入5個節點,每一個節點在2個鏈表中。
二、黑色鏈表,表明哈希衝突以後的鏈表。
三、紅色鏈表,表明節點之間的順序。
四、每一個節點,由4部分組成,分別是數據,黑色鏈表的next指針,紅色鏈表的pre指針和next指針。this
查找:經過哈希表查找到,而後移動到雙向鏈表的尾部。
刪除:經過哈希表查找到,經過雙向鏈表拿到前驅節點,直接刪除便可。
插入:先看是否存在,若是存在移動到鏈表尾部,若是不存在,鏈表滿的話刪除頭節點,而後插入鏈表尾部,不然不滿,則直接插入鏈表尾部。指針
LinkedHashMap繼承自HashMap,擁有HashMap的全部特性,同時LinkedHashMap增長了head和tail指針,用於實現雙向鏈表。code
一、LinkedHashMap默認的支持按照插入順序保存數據,新的數據插入雙向鏈表尾部。
二、構造方法支持按照訪問順序,最新訪問的數據放到雙向鏈表尾部。
blog
LinkedHashMap默認是不會自動刪除鏈表頭節點數據的,咱們須要覆蓋類的一個方法:removeEldestEntry繼承
一、實現一個類LruLinkedMap繼承LinkedHashMapip
package com.jane; import java.util.LinkedHashMap; public class LruLinkedMap<K,V> extends LinkedHashMap<K,V> { private int size; public LruLinkedMap(int initialCapacity, float loadFactor, boolean accessOrder) { super(initialCapacity, loadFactor, accessOrder); this.size = initialCapacity; } /** * @description 重寫LinkedHashMap中的removeEldestEntry方法,當LRU中元素多餘6個時, * 刪除最不常常使用的元素 */ @Override protected boolean removeEldestEntry(java.util.Map.Entry<K, V> eldest) { if(size() > size){ return true; } return false; } }
二、啓動文件:ci
package com.jane; import java.util.Map; public class Main { public static void main(String[] args) { LruLinkedMap<String, String> ss = new LruLinkedMap(5, 0.75f, true); ss.put("1", "3"); ss.put("2", "4"); ss.put("3", "6"); ss.put("4", "1"); ss.put("5", "5"); for(Map.Entry e: ss.entrySet()) { System.out.println(e.getKey()); } System.out.println("---------------"); ss.get("1"); for(Map.Entry e: ss.entrySet()) { System.out.println(e.getKey()); } System.out.println("---------------"); ss.put("7", "10"); for(Map.Entry e: ss.entrySet()) { System.out.println(e.getKey()); } } }
三、結果:
這樣LRU就輕鬆的實現了。