美文网首页
Java实现LRU算法

Java实现LRU算法

作者: cbhe | 来源:发表于2020-05-29 17:36 被阅读0次
import java.util.Arrays;

public class Cache {

    // 缓存的大小
    private static final int SIZE = 5;

    // 缓存空间
    private final int[] cacheCells = new int[SIZE];

    // 每个缓存槽中数据的年龄
    private final int[] cellAge = new int[SIZE];

    // 核心方法,从缓存中获取
    public int getFromCache(int n){

        // 遍历缓存,寻找n
        for(int i = 0; i< SIZE; i++){

            // 如果找到n,则返回,并且刷新每个槽的年龄
            if (cacheCells[i] == n){
                flushAge(i);
                return cacheCells[i];
            }

            // 如果在缓存中找到第一个空的槽,则未命中(假设0表示空,且缓存顺序存入数据)
            if (cacheCells[i] == 0){
                int storageN = getFromStorage(n);
                cacheCells[i] = storageN;
                flushAge(i);
                return storageN;
            }
        }

        // 缓存未命中,且缓存已满,需执行删除策略
        int index = deleteURL();
        int storageN = getFromStorage(n);
        cacheCells[index] = storageN;
        flushAge(index);
        return storageN;
    }

    protected int getFromStorage(int n){
        return n;
    }

    private void flushAge(int index){

        for (int i = 0; i< SIZE;i++){

            if (i != index){
                cellAge[i] = cellAge[i]+1;
            } else {
                cellAge[i] = 0;
            }
        }
    }

    private int deleteURL(){

        // 找打年龄最大的缓存槽,并返回其索引编号
        int maxAge = Integer.MIN_VALUE;
        int index = 0;
        for (int i = 0; i< SIZE;i++){
            if (cellAge[i] > maxAge){
                index = i;
                maxAge = cellAge[i];
            }
        }
        return index;
    }

    // 用于测试
    public void showCacheStatus(){
        System.out.println(Arrays.toString(cacheCells));
        System.out.println(Arrays.toString(cellAge));
    }
}

相关文章

网友评论

      本文标题:Java实现LRU算法

      本文链接:https://www.haomeiwen.com/subject/ovdfzhtx.html