LinkedHashMap用法以及相关LRU cache实现

package learnthread.basic;

import java.util.LinkedHashMap;
import java.util.Map.Entry;

/**
 * LinkedHashMap采用hashmap和双向链表实现 accessOrder为true时 双向链表中的顺序呢为访问顺序
 * 为false时双向链表中的顺序为节点插入顺序
 * 
 * @author li
 * 
 */
public class LinkedHashMapTest {
    public static void main(String[] args) {
        LinkedHashMap<String, Integer> map = new LinkedHashMap<String, Integer>(
                4, 0.75f, true);
        map.put("1", 1);
        map.put("2", 1);
        map.put("3", 1);
        map.put("4", 1);
        map.get("2");
        map.get("4");
        for (Entry<String, Integer> entry : map.entrySet()) {
            System.out.println(entry.toString());

        }
    }
}

当设置为true时,双向链表中保存的是访问顺序,因此此程序的输出结果为:

1=1
3=1
2=1
4=1

利用LinkedHashmao实现lru cache的关键为,覆盖

//该方法返回为true的时候则删除最老节点,返回为false的时候则不做操作
protected
boolean removeEldestEntry(Map.Entry<K,V> eldest) { return false; }
package learnthread.basic;

import java.util.LinkedHashMap;
import java.util.Map;

public class LRUCache<K, V> extends LinkedHashMap<K, V> {
    private final int MAX_CACHE_SIZE;

    public LRUCache(int size) {
        super((int) Math.ceil(size / 0.75) + 1, 0.75f, true);//防止发生扩容

        MAX_CACHE_SIZE = size;

    }

    /**
     * 返回true的时候则从双向链表中删除头部节点 ,为false时则不删除
     */

    @Override
    protected boolean removeEldestEntry(Map.Entry<K, V> eldest) {
        return size() > MAX_CACHE_SIZE;
    }

    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder();
        for (Map.Entry<K, V> entry : entrySet()) {
            sb.append(String.format("%s:%s ", entry.getKey(), entry.getValue()));
        }
        return sb.toString();
    }

    public static void main(String[] args) {
        LRUCache<String, Integer> cache = new LRUCache<>(3);
        cache.put("1", 1);
        cache.put("2", 2);
        cache.put("3", 3);
        System.out.println(cache.toString());
        cache.put("4", 4);
        System.out.println(cache.toString());

    }

}

输出结果为:

1:1 2:2 3:3
2:2 3:3 4:4

posted @ 2016-03-24 22:11  程序猿进化之路  阅读(140)  评论(0)    收藏  举报