今天笔试碰到一题 用java简单实现LRU缓存,当时就蒙了,很尬
然后学习下LRU缓存,留个记录
LRU(Least Recently Used)最近最少使用 就是说将最近最近频繁使用的留下来,很久没用或者很少用的淘汰掉
原理是:最近经常使用的,下一次使用的概率很大
package temp;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
//将最近不使用的淘汰掉
//用链表实现原理,将最近使用的放到头部,最
//近新加的放到头部,这样尾部的数据就是近期没有被访问过得了
//我们认为list只能容纳100个数据
public class LRU {
private static int SIZE=100;
public static List<String> list = new ArrayList<String>();
public static void main(String[] args) {
// TODO Auto-generated method stub
}
//向LRU加入数据
//list会自动将数据放在头部
public void put_LRU(String str) {
list.add(str);
}
//限制LRU的容量
//超过SIZE个数就清除掉
private static void capacity_LRU() {
Iterator<String> iterator = list.iterator();
int i = 0;
while(iterator.hasNext()) {
i++;
if(i>SIZE) iterator.remove();
}
}
public boolean fangwen_LRU(String str) {
//确保容量只有100
LRU.capacity_LRU();
if(LRU.have_LRU(str)) {
list.add(str);return true;
}return false;
}
//判断是否有str元素,是 返回true否则返回false
private static boolean have_LRU(String str) {
//确保容量只有100
LRU.capacity_LRU();
Iterator<String> iterator = list.iterator();
while(iterator.hasNext()) {
if(iterator.next().equals(str)) {
iterator.remove();
return true;
}
}
return false;
}
}
总共外部可以访问的两个public函数
public void put_LRU(String str)
public void fangwen_LRU(String str)
这分别代表新加的缓存,和之前的缓存重新访问
原理:
新加的放在链表头,访问原来的,吧原来的调到链表头,限制长度为100,如果一直没有被调动过的就会越来越往后,直至被清理掉
第一次写,看起来好傻,哈哈哈