设计一套具备LRU过期策略的缓存程序

考察点:

  • 缓存容器的设计:LinkedHashMap的使用
  • 缓存容器并发考虑
import java.util.LinkedHashMap;
import java.util.Map;

/**
 * Created by zhangyuanchen on 2017/6/22.
 */
public class LruTest {

    private int cacheSize;
    private LinkedHashMap map;
    private static final float loadFactor = 0.75f;

    /**
     * @param cacheSize 缓存大小
     */
    public LruTest(int cacheSize) {
        this.cacheSize = cacheSize;
        int initialCapacity = (int) Math.ceil(cacheSize / loadFactor) + 1;
        map = new LinkedHashMap(initialCapacity, loadFactor, true) {
            @Override
            protected boolean removeEldestEntry(Map.Entry eldest) {
                return size() > LruTest.this.cacheSize;
            }
        };
    }

    public synchronized void put(K key, V value) {
        map.put(key, value);
    }

    public synchronized V get(K key) {
        return map.get(key);
    }

    public static void main(String[] args) {
        LruTest lruTest = new LruTest(3);
        lruTest.put(1, "one");  // 1
        lruTest.put(2, "two");  // 2,1
        lruTest.put(3, "three"); // 3,2,1
        lruTest.put(4, "four"); // 4,3,2
        lruTest.get(3); // 3,4,2
        lruTest.get(2); // 2,3,4
    }
}

  • LinkedHashMapinitialCapacity初始容量,loadFactor扩容因子,true代表使用访问顺序,false代表使用插入顺序,一般情况下,不必指定排序模式,其迭代顺序即为默认为插入顺序
  • 重写LinkedHashMap中的removeEldestEntry方法,该方法可以提供在每次添加新条目时移除最旧条目的实现程序,默认返回false,即永远不能移除最旧的元素, 重写后会移出最旧的元素

你可能感兴趣的:(设计一套具备LRU过期策略的缓存程序)