標籤:lru
lru詳細介紹及簡單代碼實現:
http://blog.csdn.net/beiyetengqing/article/details/7855933
以下是本人的加強的lru緩衝類,增加單例擷取、緩衝逾時機制和修複一個clear()的bug
package com.george.xblog.utils;import java.util.Hashtable;import java.util.Map;/** * Created by george.yang on 15/8/15. */public class LruCache { private static final class Entry { public String key;// 鍵 public Object value;// 值 public Entry prev;// 前一節點 public Entry next;// 後一節點 public long validTime;//有效最大時間 } private static LruCache instance; public static synchronized LruCache getInstance() { if (instance==null) { instance = new LruCache(100); } return instance; } private int cacheSize; private Map<String, Entry> nodes;// 緩衝容器 private Entry first;// 鏈表頭 private Entry last;// 鏈表尾 public LruCache(int i) { cacheSize = i; nodes = new Hashtable<String, Entry>(i);//緩衝容器 } /** * 擷取緩衝中對象,並把它放在最前面 */ public <T> T get(String key) { Entry node = nodes.get(key); if (node != null) { if (System.currentTimeMillis()>node.validTime) { //在鏈表中刪除 remove(node); //在hashtable中刪除 nodes.remove(key); } else { moveToHead(node); return (T)node.value; } } return null; } /** * 加入緩衝 * 添加 entry到hashtable, 並把entry * @param key * @param timeout 逾時時間,毫秒 * @param value */ public void put(String key,long timeout, Object value) { //先查看hashtable是否存在該entry, 如果存在,則只更新其value Entry node = nodes.get(key); if (node == null) { //緩衝容器是否已經超過大小. if (nodes.size() >= cacheSize) { nodes.remove(last.key); removeLast(); } node = new Entry(); } node.validTime = System.currentTimeMillis() + timeout; node.value = value; //將最新使用的節點放到鏈表頭,表示最新使用的. moveToHead(node); nodes.put(key, node); } /** * 將entry刪除, 注意:刪除操作只有在cache滿了才會被執行 */ public void remove(String key) { Entry node = nodes.get(key); //在鏈表中刪除 remove(node); //在hashtable中刪除 nodes.remove(key); } private void remove(Entry node) { if (node != null) { if (node.prev != null) { node.prev.next = node.next; } if (node.next != null) { node.next.prev = node.prev; } if (last == node) last = node.prev; if (first == node) first = node.next; } } /** * 刪除鏈表尾部節點,即使用最後 使用的entry */ private void removeLast() { //鏈表尾不為空白,則將鏈表尾指向null. 刪除連表尾(刪除最少使用的緩衝對象) if (last != null) { if (last.prev != null) last.prev.next = null; else first = null; last = last.prev; } } /** * 移動到鏈表頭,表示這個節點是最新使用過的 */ private void moveToHead(Entry node) { if (node == first) return; if (node.prev != null) node.prev.next = node.next; if (node.next != null) node.next.prev = node.prev; if (last == node) last = node.prev; if (first != null) { node.next = first; first.prev = node; } first = node; node.prev = null; if (last == null) last = first; } /* * 清空緩衝 */ public void clear() { first = null; last = null; nodes = new Hashtable<String, Entry>(cacheSize); }}
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
8.16 lru緩衝java版