LRU:(least recently used) 最近最少使用演算法。LRU演算法的java中資料結構的實現是一個LRU演算法在面試中經常被問到的問題,我們可以用LinkedList來表示最近和最少使用。將訪問過的資料用LinkedList資料結構進行儲存,如果尋找最少使用,直接返回LinkedList的尾節點即可。如果添加一個最近訪問的資料a,可以將a從鏈表中的位置刪除,移到鏈表的頭部。
但是鏈表中查詢資料DATA的位置一般訪問速度慢,所以需要藉助其它資料結構來完成尋找,我們知道HashMap是一個高效的查詢資料結構。如果我們將該資料DATA作為鍵,DATA對應的節點作為值,儲存在HashMap中,那麼,我們可以得到查詢複雜度為O(1)的操作。
JAVA中已經協助我們實現了一個這樣的資料結構,LinkedHashMap.LinkedHashMap存放的索引值對和存放時的位置一致。不會變化,可以設定LinkedHashMap按照插入的順序排序,也可以按照訪問的順序排序,最先訪問的放置在最後面,最近訪問的在最前面。
LinkedHashMap自身已經實現了順序儲存,預設情況下是按照元素的添加順序儲存,也可以啟用按照訪問順序儲存,即最近讀取的資料放在最前面,最早讀取的資料放在最後面,然後它還有一個判斷是否刪除最老資料的方法,預設是返回false,即不刪除資料,我們使用LinkedHashMap實現LRU緩衝的方法就是對LinkedHashMap實現簡單的擴充,下面是簡單實現。 import java.util.LinkedHashMap; import java.util.Map; public LRUCache<K, V> extends LinkedHashMap<K, V> { private int cacheSize; //緩衝值大小 public LRUCache( int cacheSize) { super ( 16 , 0.75 , true ); //true設定按照訪問順序排序 this .cacheSize = cacheSize; } protected boolean removeEldestEntry(Map.Entry<K, V> eldest) { return size() >= cacheSize; //如果LinkedHashMap的大小超過緩衝值,返回true刪除最早的資料 } }