思路
Lru缓存一般利用LinkedHashMap,accessOrder置为true,则自动按照访问顺序排序,最近访问的排在前面。
实现
public abstract class LruCache<T> {
// 缓存的容器
private final LinkedHashMap<String, T> cache = new LinkedHashMap<>(100, 0.75f, true);
// 缓存最大值设置为100KB
private final int initialMaxSize = 100;
private int currentSize = 0;
// 获取对象所占内存大小
abstract int getSize(T item);
// 读取
public T get(String key) {
return cache.get(key);
}
// 储存
public void put(String key, T item) {
final int itemSize = getSize(item);
// 如果储存对象大于最大容量,不储存
if (itemSize >= maxSize) {
return null;
}
// 储存,然后Lru清理空间
cache.put(key, item);
currentSize += itemSize;
trimToSize(initialMaxSize);
}
// 清理空间到size
private void trimToSize(int size) {
Map.Entry<String, T> last;
while (currentSize > size) {
last = cache.entrySet().iterator().next();
final T toRemove = last.getValue();
currentSize -= getSize(toRemove);
final T key = last.getKey();
cache.remove(key);
}
}
}