8.16 lru緩衝java版

來源:互聯網
上載者:User

標籤: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版

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.