1 通过 LinkedHashMap
LinkedHashMap自身已经实现了顺序存储,默认情况下是按照元素的添加顺序存储,也可以启用按照访问顺序存储,即最近读取的数据放在最前面,最早读取的数据放在最后面,然后它还有一个判断是否删除最老数据的方法,默认是返回false,即不删除数据,我们使用LinkedHashMap实现LRU缓存的方法就是对LinkedHashMap实现简单的扩展,
public class LURCache<K,V> extends LinkedHashMap<K,V> {
private int size;
private LURCache(int size) {
//当参数accessOrder为true时,即会按照访问顺序排序,最近访问的放在最前,最早访问的放在后面
super(size, 0.75f, true);
this.size = size;
}
@Override
protected boolean removeEldestEntry(Map.Entry<K, V> eldest) {
return size() > size;
}
public static <K, V> LURCache<K, V> newInstance(int size) {
return new LURCache<>(size);
}
}
2 通过 linklist 实现
put 插入时候 如果没有则插入到头部,如果有则移动此条数据到头部。
如果超过了 cache容量 就删除 最后的记录。
get 操作 如果有则返回,并将此条数据移动到头部
public class LinkListCache<V> {
private int size;
public LinkedList<V> linkedList;
public V get(V v){
int index = linkedList.indexOf(v);
if(index == -1){
//addToHead(v);
return null;
}
moveToHead(index);
return v;
}
public V put(V v){
int index = linkedList.indexOf(v);
if(index == -1){
linkedList.addFirst(v);
addToHead(v);
}
else{
moveToHead(index);
}
return v;
}
private void moveToHead(int index){
V v = linkedList.remove(index);
linkedList.addFirst(v);
}
private void addToHead(V e){
linkedList.addFirst(e);
if(linkedList.size() >= size){
linkedList.removeLast();
}
}
public void show(){
linkedList.forEach(t->{
System.out.println(t);
});
}
public LinkListCache(int size) {
this.size = size;
this.linkedList = new LinkedList<>();
}
public static <V> LinkListCache< V> newInstance(int size) {
return new LinkListCache<>(size);
}
public static void main(String[] args) {
LinkListCache<String> cache = LinkListCache.newInstance(5);
cache.put("hello");
cache.put("world");
cache.put("river");
cache.put("crazzy");
cache.put("frank");
cache.put("lucy");
cache.show();
System.out.println(" ================= ");
cache.get("river");
cache.show();
}
}
网友评论