使用Java的Queue实现LRU算法

LRU最近最少使用,是一个页面置换算法,也是一种缓存命中算法,类似于固定长度的数组,最新访问的元素在第一位,如果超过数组长度直接删除,提供一种java的实现方式。如果有其他的算法欢迎在下面评论留言讨论

package com.lru;

import java.util.ArrayDeque;

/**
 * @Description: 使用两个队列来实现lru
 * @Date 2020/5/9 16:21
 **/
public class LRUTest {
    //队列长度为5
    private final Integer size = 5;
    private ArrayDeque queue1 = new ArrayDeque<>(size);
    private ArrayDeque queue2 = new ArrayDeque<>(size);

    public static void main(String[] args) {
        LRUTest lruTest = new LRUTest();
        lruTest.find(1);
        lruTest.find(2);
        lruTest.find(3);
        lruTest.find(2);
        lruTest.find(4);
        lruTest.find(5);
        lruTest.find(6);
        lruTest.find(6);
        lruTest.find(1);
    }

    /**
     * 在队列中查找元素,如果找到则将此元素移到第一位,如果没有找到则在第一位插入这个元素
     *
     * @param item
     */
    public void find(Integer item) {
        //如果第一个元素就是查找的元素,则不进行任何操作
        if (!queue1.isEmpty() && queue1.getFirst().equals(item)) {
            System.out.println("第一位就是待查找的元素,不处理");
            return;
        }
        while (!queue1.isEmpty()) {
            int integer = queue1.pollLast();
            if (!item.equals(integer)) {
                addAndRefactQueue(integer);
            }
        }
        //不管找不找到元素,都需要在queue2的头插入此元素,表明是最新访问的
        addAndRefactQueue(item);
        queue1.clear();
        queue1.addAll(queue2);
        queue2.clear();
        System.out.println("查找元素:"+item+",最终队列元素:"+queue1);
    }

    /**
     * 添加一个元素到队列中,并判断队列是否超过大小,如果超过,则从队尾删除一个元素
     *
     * @param integer
     */
    private void addAndRefactQueue(int integer) {
        queue2.addFirst(integer);
        if (queue2.size() > size) {
            queue2.removeLast();
        }
    }

}

====================================
运行结果:
查找元素:1,最终队列元素:[1]
查找元素:2,最终队列元素:[2, 1]
查找元素:3,最终队列元素:[3, 2, 1]
查找元素:2,最终队列元素:[2, 3, 1]
查找元素:4,最终队列元素:[4, 2, 3, 1]
查找元素:5,最终队列元素:[5, 4, 2, 3, 1]
查找元素:6,最终队列元素:[6, 5, 4, 2, 3]
第一位就是待查找的元素,不处理
查找元素:1,最终队列元素:[1, 6, 5, 4, 2]

 

你可能感兴趣的:(JAVA开发笔记,JAVA开发)