使用LinkedHashMap实现LRU算法

使用LinkedHashMap实现LRU算法

LRU算法,最近最少使用原则,如果要实现该算法,可以借助LinkedHashMap数据结构,LinkedHashMap继承HashMap,底层使用哈希表和双向链表来保存所有元素,使用LinkedHashMap可以确保元素按照顺序进行存储。

默认情况下,LinkedHashMap是按照元素的添加顺序存储,也可以启用按照访问顺序存储,即最近读取的数据放在最前面,最早读取的数据放在最后面,然后它还有一个判断是否删除最老数据的方法,默认是返回false,即不删除数据。

下面就基于这两种存储方式,简单展示一下如何实现LRU算法:

 

一、基于按添加顺序存储的方式实现LRU:

public class LRUTest
{
    int capacity;
    LinkedHashMap<Integer, Integer> cache;

    LRUTest(int capacity)
    {
        cache = new LinkedHashMap<>();
        this.capacity = capacity;
    }

    //访问元素
    public int get(int key)
    {
        if(!cache.containsKey(key))
        {
            return -1;
        }

        //存在,先从链表头部删除删除,在插入到链表尾部
        int val = cache.get(key);
        cache.remove(key);
        cache.put(key, val);

        return val;
    }

    //添加元素
    public void put(int key, int val)
    {
        if(cache.containsKey(key))
        {
            cache.remove(key);
        }

        //如果链表已经满了,则删除头部节点
        if(cache.size() == capacity)
        {
            Set<Integer> keySet = cache.keySet();
            Iterator<Integer> iterator = keySet.iterator();
            cache.remove(iterator.next());
        }

        cache.put(key, val);
    }
}

 

二、基于按访问顺序存储的方式实现LRU:

该方式的核心就是继承LinkedHashMap,并设置LinkedHashMap的accessOrder参数为true,然后重写LinkedHashMap的removeEldestEntry()方法。

public class LRUTest extends LinkedHashMap<String, String>
{
    private int capacity;

    /**
     * 当LinkedHashMap的accessOrder参数为true时,即会按照访问顺序排序,最近访问的放在最前,最早访问的放在后面
     */
    public LRUTest(int capacity) {
        super(16, 0.75f, true);
        this.capacity = capacity;
    }

    /**
     * LinkedHashMap自带的判断是否删除最老的元素方法,默认返回false,即不删除老数据
     */
    @Override
    protected boolean removeEldestEntry(Map.Entry<String, String> eldest)
    {
        return size() > capacity;
    }
}

测试方法:

    public static void main(String[] args)
    {
        Map<String, String> linkedHashMap = new LRUTest(6);

        linkedHashMap.put("1", "1");
        linkedHashMap.put("2", "2");
        linkedHashMap.put("3", "3");
        linkedHashMap.put("4", "4");
        linkedHashMap.put("5", "5");
        linkedHashMap.put("6", "6");
        linkedHashMap.put("7", "7");
        linkedHashMap.put("8", "8");
        linkedHashMap.put("9", "9");

        System.out.println("size="+linkedHashMap.size());
        System.out.println(linkedHashMap.get("8"));

        linkedHashMap.forEach((k,v) ->{
            System.out.print(k + ":"+ v +"  ");
        });

        System.out.println();
        System.out.println("size="+linkedHashMap.size());
    }

输出结果:

size=6
8
4:4  5:5  6:6  7:7  9:9  8:8  
size=6

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/100026.html原文链接:https://javaforall.net

(0)
上一篇 2021年4月10日 下午1:05
下一篇 2021年4月10日 下午2:00


相关推荐

  • WIFI-OTA测试规范简介

    WIFI-OTA测试规范简介WIFI OTA 测试规范简介

    2026年3月17日
    2
  • 浏览器代理服务器没有响应解决方案怎么办_电脑代理服务器无响应

    浏览器代理服务器没有响应解决方案怎么办_电脑代理服务器无响应前几天,为了满足爬虫的需要,我在自己电脑上设置了一个代理IP。在利用代理IP运行爬虫程序一天之后,终于爬够了所需的数据量。但是非常奇怪的是,爬完虫的第二天,我用浏览器就打不开网页了,浏览器一直提示我代理服务器没有响应,或者说是ERR_PROXY_CONNECTION_FAILED这一错误。我刚开始的时候以为是浏览器的问题,但是在更换了许多浏览器之后依然没有用。…

    2025年6月9日
    4
  • Delphi2007使用心得

    Delphi2007使用心得Byneoyao 2007 04 05 nbsp 说实话 经过 1 天的使用 感觉 Delphi2007 真是太爽了 我先小结几点 各位后续使用的心得再陆续跟上 1 关于 IDE 启动速度 Delphi2007 的 IDE 速度相比 BDS2006 只能用一个字形容 快 例如我目前安装了如下控件 Appcontrols Ehlib Raize Sdac TmsPack 等等 机器是 IBM nbsp ThinkPad

    2026年3月16日
    2
  • Flyway简介

    Flyway简介Flyway 简介总结 Flyway 可以很方便的帮我们完成数据库部署和增量升级 很有用 但是版本回滚操作并不给力 1 简介 1 1 Flyway 是什么 Flyway 是一款数据库迁移 migration 工具 简单点说 就是在你部署应用的时候 帮你执行数据库脚本的工具 Flyway 支持 SQL 和 Java 两种类型的脚本 你可以将脚本打包到应用程序中 在应用程序启动时 由 Fl

    2026年3月26日
    2
  • encode和decode的用法_postal

    encode和decode的用法_postaldecode和encode的区别和介绍by.decode(encoding=’UTF-8′,errors=’strict’)str.encode(encoding=’UTF-8′,errors=’strict’)显而易见decode是解码,encode是编码 解码代表bytes类型转成str类型 编码代表str类型转成bytes类型 而bytes类型的数据一般在写入文件时需要用到1#!/usr/bin/envpython2#-*-coding:utf-8-…

    2022年10月7日
    7
  • 认识 Iconfont 以及什么是 .eot、.woff、.ttf、.svg「建议收藏」

    认识 Iconfont 以及什么是 .eot、.woff、.ttf、.svg「建议收藏」一、Iconfont1.概述在前端作业中,二十年前只有页面中铺满文字就算上线产品,现如今,不加点俏皮的“图标”会让页面显得很Low很Low。图标在写这篇文章之前,我一直以为上图中的“图

    2022年8月5日
    9

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号