LinkedList實現基於LRU算法的緩存
版權聲明:本文為博主原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
學過操作系統的人都知道LRU頁面切換算法,其實這個算法不僅僅只是能在頁面切換中應用到,在緩存中也有很實際的應用。最典型的實現方式是采用LinkedHashMap來實現這個緩存,大家可以在Java源碼里面看到這個類的作者關於這個的描述,不過全是英文,但是卻明確提到過。
下面廢話不多說,直接展示我自己關於這個算法實現的代碼吧,親測通過:
核心算法代碼:
package hk.inso.www.cache; import java.util.Hashtable; import java.util.LinkedList; /** * Created by IntelliJ IDEA. * Date: 8/7/15 4:46 PM * Author: Richard */ public class LinkedListCache<Object>{ //默認的緩存大小 private static int CAPACITY = 0; //引用一個雙向鏈接表 private LinkedList<Object> list; //構造函數 public LinkedListCache(int capacity) { this.CAPACITY = capacity; list = new LinkedList<Object>(); } //添加一個元素 public synchronized void put(Object object) { if(list != null && list.contains(object)) { list.remove(object); } removeLeastVisitElement(); list.addFirst(object); } //移除最近訪問次數最少的元素 private synchronized void removeLeastVisitElement() { int size = size(); //注意,這兒必須得是CAPACITY - 1否則所獲的size比原來大1 if(size > (CAPACITY - 1) ) { Object object = list.removeLast(); System.out.println("本次被踢掉的元素是:" + object.toString()); } } //獲取第N個索引下面的元素 public synchronized Object get(int index) { return list.get(index); } //清空緩存 public synchronized void clear() { list.clear(); } //獲取鏈接表的大小 public int size() { if(list == null) { return 0; } return list.size(); } //toString方法 public String toString() { return list.toString(); } }
測試代碼:
package hk.inso.www.test; import hk.inso.www.cache.LRUCache; import hk.inso.www.cache.LinkedListCache; import hk.inso.www.cache.MapCache; import java.util.Iterator; import java.util.Map; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; /** * Created by Richard on 8/5/15. */ public class CacheTest { public static void main(String[] args) throws InterruptedException { LinkedListCache linkedListCache = new LinkedListCache<String>(5); linkedListCache.put("1"); System.out.println(linkedListCache.toString()); Thread.sleep(1000); linkedListCache.put("2"); System.out.println(linkedListCache.toString()); Thread.sleep(1000); linkedListCache.put("3"); System.out.println(linkedListCache.toString()); Thread.sleep(1000); linkedListCache.put("4"); System.out.println(linkedListCache.toString()); Thread.sleep(1000); linkedListCache.put("5"); System.out.println(linkedListCache.toString()); Thread.sleep(1000); linkedListCache.put("1"); System.out.println(linkedListCache.toString()); Thread.sleep(1000); linkedListCache.put("6"); System.out.println(linkedListCache.toString()); Thread.sleep(1000); linkedListCache.put("4"); System.out.println(linkedListCache.toString()); Thread.sleep(1000); linkedListCache.put("7"); System.out.println(linkedListCache.toString()); } }
不要吐槽這個哈,時間關系,就直接這么演示了,你可以直接拷貝下來運行就可以了。希望可以幫到你!