package com.cache;
/**
* First In First Out,先进先出
* 这个和LRUCache实现方式是一样的,只是实例化LinkedHashMap时传参不一样
*
*/
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Set;
public class FIFOCache {
private final int MAX_CACHE_SIZE;
private final float DEFAULT_LOAD_FACTORY = 0.75f;
LinkedHashMap map;
public FIFOCache(int cacheSize) {
MAX_CACHE_SIZE = cacheSize;
/*
* 由于LinkedHashMap是为自动扩容的,当table数组中元素大于
* Capacity * loadFactor的时候,就会自动进行两倍扩容。
* 但是为了使缓存大小固定,就需要在初始化的时候传入容量大小和负载因子。
* 为了使得到达设置缓存大小不会进行自动扩容,需要将初始化的大小
* 进行计算再传入,可以将初始化大小设置为(缓存大小 / loadFactor) + 1,
* 这样就可以在元素数目达到缓存大小时,也不会进行扩容了。
*/
int capacity = (int) Math.ceil(MAX_CACHE_SIZE / DEFAULT_LOAD_FACTORY)
+ 1;
/*
* 第三个参数设置为true,代表LinkedList按访问顺序排序,可作为LRU缓存
* 第三个参数设置为false,代表按插入顺序排序,可作为FIFO缓存
*/
map = new LinkedHashMap(capacity, DEFAULT_LOAD_FACTORY, false) {
private static final long serialVersionUID = 2009680157678631777L;
@Override
protected boolean removeEldestEntry(Map.Entry eldest) {
return size() > MAX_CACHE_SIZE;
}
};
}
public synchronized void put(K key, V value) {
map.put(key, value);
}
public synchronized V get(K key) {
return map.get(key);
}
public synchronized void remove(K key) {
map.remove(key);
}
public synchronized Set> getAll() {
return map.entrySet();
}
@Override
public String toString() {
StringBuilder stringBuilder = new StringBuilder();
for (Map.Entry entry : map.entrySet()) {
stringBuilder.append(String.format("%s: %s ", entry.getKey(),
entry.getValue()));
}
return stringBuilder.toString();
}
public static void main(String[] args) {
FIFOCache lru1 = new FIFOCache<>(5);
lru1.put(1, 1);
lru1.put(2, 2);
lru1.put(3, 3);
System.out.println(lru1);
lru1.get(1);
System.out.println(lru1);
lru1.put(4, 4);
lru1.put(5, 5);
lru1.put(6, 6);
System.out.println(lru1);
}
}
运行结果
1: 1 2: 2 3: 3
1: 1 2: 2 3: 3
2: 2 3: 3 4: 4 5: 5 6: 6
本文固定链接:心知博客 » 缓存实现策略之先进先出(FIFO)Java实现
本站内容除特别标注外均为原创,欢迎转载,但请保留出处!