LRU实现

import java.util.LinkedHashMap;
import java.util.Map;

/**
 * LRU (Least Recently Used)
 */
public class LRUCache<K, V> extends LinkedHashMap<K, V> {

    private static final long serialVersionUID = 1L;
    //缓存大小
    private int cacheSize;

    public LRUCache(int cacheSize) {
        //第三个参数true是关键
        super(10, 0.75f, true);
        this.cacheSize = cacheSize;
    }

    /**
     * 缓存是否已满
     */
    @Override
    protected boolean removeEldestEntry(Map.Entry<K, V> eldest) {
        boolean r = size() > cacheSize;
        if(r){
            System.out.println("清除缓存key:"+eldest.getKey());
        }
        return r;
    }

    //测试
    public static void main(String[] args) {
        LRUCache<String, String> cache = new LRUCache<String, String>(5);
        cache.put("1", "1");
        cache.put("2", "2");
        cache.put("3", "3");
        cache.put("4", "4");
        cache.put("5", "5");

        System.out.println("初始化:");
        System.out.println(cache.keySet());
        System.out.println("访问3:");
        cache.get("3");
        System.out.println(cache.keySet());
        System.out.println("访问2:");
        cache.get("2");
        System.out.println(cache.keySet());
        System.out.println("增加数据6,7:");
        cache.put("6", "6");
        cache.put("7", "7");
        System.out.println(cache.keySet());
    }
}
时间: 2024-10-25 08:37:07

LRU实现的相关文章

操作系统 页面置换算法LRU和FIFO

LRU(Least Recently Used)最少使用页面置换算法,顾名思义,就是替换掉最少使用的页面. FIFO(first in first out,先进先出)页面置换算法,这是的最早出现的置换算法.该算法总是淘汰最先进入内存的页面,即选择在内存中驻留时间最长的页面给予淘汰. FIFO置换算法有这样一个奇怪现象:内存空间块数越多,缺页中断率可能相反的越高(缺页中断次数越高). LFU(Least Frequently Used)最近最少使用算法,它是基于“如果一个数据在最近一段时间内使用次

LRU (Least Recently Used) 算法的Java实现

实现代码如下: import java.util.LinkedHashMap; import java.util.Map; /**  * LRU (Least Recently Used) 算法的Java实现  * @param <K>  * @param <V>  * @author 杨尚川  */ public class LRUCache<K, V> extends LinkedHashMap<K, V> {     //缓存大小     privat

leetcode LRU Cache

题目链接.实现一个数据结构用于LRU,最近最少使用,O(1)插入和删除.关于LRU的基本知识可参考here. 先推荐JustDoIT的. 下面是我自己实现的. class LRUCache{ public: //146LRU Least Recently Used int LRUsize; struct LRUNode { int key; int value; LRUNode *pre, *next; LRUNode(int x, int y): key(x), value(y), pre(N

LRU 缓冲池 (不考虑多线程)

lru:(转)LRU算法的实现 什么是LRU算法? LRU是Least Recently Used的缩写,即最近最少使用页面置换算法,是为虚拟页式存储管理服务的.关于操作系统的内存管理,如何节省利用容量不大的内存为最多的进程提供资源,一直是研究的重要方向.而内存的虚拟存储管理,是现在最通用,最成功的方式——在内存有限的情况下,扩展一部分外存作为虚拟内存,真正的内存只存储当前运行时所用得到信息.这无疑极大地扩充了内存的功能,极大地提高了计算机的并发度.虚拟页式存储管理,则是将进程所需空间划分为多个

缓存淘汰算法之LRU实现

Java中最简单的LRU算法实现,就是利用 LinkedHashMap,覆写其中的removeEldestEntry(Map.Entry)方法即可 如果你去看LinkedHashMap的源码可知,LRU算法是通过双向链表来实现,当某个位置被命中,通过调整链表的指向将该位置调整到头位置,新加入的内容直接放在链表头, 如此一来,最近被命中的内容就向链表头移动,需要替换时,链表最后的位置就是最近最少使用的位置. import java.util.ArrayList; import java.util.

146. LRU Cache

Design and implement a data structure for Least Recently Used (LRU) cache. It should support the following operations: get and put. get(key) - Get the value (will always be positive) of the key if the key exists in the cache, otherwise return -1. put

LinkedHashMap:我还能实现LRU

众所周知,LinkedHashMap继承自HashMap,在原先的HashMap的基础上,它增加了Entry的双向链接. 有意思的是基于这种实现特性,LinkedHashMap 在迭代遍历时,取得键值对的顺序的依据是其插入次序或者是最近最少使用(LRU)的次序. LRU算法根据数据的历史访问记录来淘汰数据,其核心思想是"如果数据最近被访问过,那么将来被访问的几率也更高",从而实现在定量缓存空间下缓存内容的管理,常用于浏览器和移动端各应用等本地缓存管理. 通过access方式创建Link

缓存淘汰算法--LRU算法

1. LRU1.1. 原理 LRU(Least recently used,最近最少使用)算法根据数据的历史访问记录来进行淘汰数据,其核心思想是"如果数据最近被访问过,那么将来被访问的几率也更高". 1.2. 实现 最常见的实现是使用一个链表保存缓存数据,详细算法实现如下: 1. 新数据插入到链表头部: 2. 每当缓存命中(即缓存数据被访问),则将数据移到链表头部: 3. 当链表满的时候,将链表尾部的数据丢弃. 1.3. 分析 [命中率] 当存在热点数据时,LRU的效率很好,但偶发性的

LRU算法实现

LRU是Last Recent Used 缩写,做为一种缓存算法,将最近较少使用的缓存失效.memcache采用了该算法.如下采用了一种PHP的实现方式.该算法将每次新增的内容,放到缓存顶部,达到缓存极限时,将缓存底部的内容清除.可以通过如下PHP代码来模拟. <?php class LRUCache { private $head; private $tail; private $capacity; private $hashmap; public function __construct($