考察点:
- 缓存容器的设计:LinkedHashMap的使用
- 缓存容器并发考虑
import java.util.LinkedHashMap;
import java.util.Map;
/**
* Created by zhangyuanchen on 2017/6/22.
*/
public class LruTest<K, V> {
private int cacheSize;
private LinkedHashMap<K, V> 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<K, V>(initialCapacity, loadFactor, true) {
@Override
protected boolean removeEldestEntry(Map.Entry<K, V> 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<Integer, String> lruTest = new LruTest<Integer, String>(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
}
}
-
LinkedHashMap
中initialCapacity
初始容量,loadFactor
扩容因子,true
代表使用访问顺序,false
代表使用插入顺序,一般情况下,不必指定排序模式,其迭代顺序即为默认为插入顺序
- 重写
LinkedHashMap
中的removeEldestEntry
方法,该方法可以提供在每次添加新条目时移除最旧条目的实现程序,默认返回false
,即永远不能移除最旧的元素, 重写后会移出最旧的元素