LRU算法

class LRUCahce {

        private Node head;

        private Node tail;

        private Map hashMap;

        private int capacity;

        public LRUCahce(int capacity) {
            this.capacity = capacity;
            hashMap = new HashMap<>();
        }

        /**
         *
         * @Title: put
         * @Description:
         * @param key
         * @param value
         */
        public void put(String key,Object value) {
            Node node = hashMap.get(key);
            if (node != null) {
                node.value = value;
                refreshNode(node);
            }else{
                if (hashMap.size() >= capacity) {
                    removeNode(head);
                    hashMap.remove(head.key);
                }
                Node newNode = new Node(key, value);
                addNode(newNode);
                hashMap.put(key, newNode);
            }
        }

        /**
         * @Title: get
         * @Description:
         * @param key
         * @return
         */
        public Object get(String key) {
            Node node = hashMap.get(key);
            if (node == null) {
                return null;
            }
            refreshNode(node);
            return node.value;
        }

        /**
         * @Title: remove
         * @Description:
         * @param key
         */
        public void remove(String key) {
            Node node = hashMap.get(key);
            if (node == null) {
                return;
            }else{
                removeNode(node);
                hashMap.remove(key);
            }
        }

        /**
         * @Title: refreshNode
         * @Description:
         * @param node
         */
        public void refreshNode(Node node) {
            if (node == tail) {
                return;
            }
            removeNode(node);
            addNode(node);
        }

        /**
         * @Title: removeNode
         * @Description:删除节点
         * @param node
         */
        public void removeNode(Node node) {
            if (head == node && tail == node) {
                head = null;
                tail = null;
            } else if (head == node) {
                head = head.next;
                head.pre.next = null; //help GC
                head.pre = null;
            }else if (tail == node) {
                tail = tail.pre;
                tail.next.pre = null;//help GC
                tail.next = null;
            }else {
                node.pre.next = node.next;
                node.next.pre = node.pre;
            }
        }

        /**
         * @Title: addNode
         * @Description: 新增节点
         * @param node
         */
        public void addNode(Node node) {
            if (tail == null) {
                head = tail = node;
            } else {
                tail.next = node;
                node.pre = tail;
                tail = node;
                tail.next = null;
            }
        }

        class Node {
            private String key;
            private Object value;
            private Node pre;// 前驱结点
            private Node next;// 后驱结点

            public Node(String key, Object value) {
                this.key = key;
                this.value = value;
            }
        }
    }

Original: https://www.cnblogs.com/wha6239/p/15035468.html
Author: 一只烤鸭朝北走
Title: LRU算法

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/611790/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • mydumper备份mysql8.0 sql thread被kill掉

    这个问题是很久以前的事了。今天,我看了看我的笔记,发现了这个问题。我当时没有仔细看过它。我现在就想复制它。 [En] This problem was a long time ag…

    数据库 2023年5月24日
    0104
  • Elasticsearch搜索引擎的使用

    当用户在搜索框输入关键字后,我们要为用户提供相关的搜索结果。 这种需求依赖数据库的模糊查询like关键字可以实现,但是like关键字的效率极低,而且查询需要在多个字段中进行,使用l…

    数据库 2023年6月14日
    0126
  • Collection

    ArrayList底层使用了数组存储 LinkedList底层使用双向链表 HashSet底层是一个HashMap支持,HashMap底层物理实现一个Hash表 LinkedHas…

    数据库 2023年6月14日
    079
  • Servlet规范

    servlet&#x89C4;&#x8303; 一。介绍1.它是javaee里面的一种规范。2.作用:1)在servlet规范中指定了动态资源文件的开发步骤2)在s…

    数据库 2023年6月11日
    044
  • 为知笔记迁移到印象笔记-从入门到放弃

    最新进展 已经放弃了,目前正在逐步把笔记迁移到本地,用icloud来同步。 为什么放弃迁移? 没有找到好的迁移方案,迁移过去文档不方便查找和使用 为什么放弃印象笔记? 1.主要使用…

    数据库 2023年6月9日
    082
  • Linux下安装MySQL问题及报错解决

    前言: 在Linux环境下,安装MySQL服务 环境: 虚拟机CentOS7———————&#8…

    数据库 2023年5月24日
    075
  • mysql数据库备份之主从同步配置

    主从同步意义? 主从同步使得数据可以从一个数据库服务器复制到其他服务器上,在复制数据时,一个服务器充当主服务器(master),其余的服务器充当从服务器(slave)。因为复制是异…

    数据库 2023年6月6日
    079
  • 学会使用MySQL的Explain执行计划,SQL性能调优从此不再困难

    上篇文章讲了MySQL架构体系,了解到MySQL Server端的优化器可以生成Explain执行计划,而执行计划可以帮助我们分析SQL语句性能瓶颈,优化SQL查询逻辑,今天就一块…

    数据库 2023年5月24日
    073
  • Java 笔记(全)

    ​ 标识符:给类或者变量类的方法属性命名都是标识符 ​ 组成必须是: &#x5B57;&#x6BCD;&#x3001;&#x6570;&#x…

    数据库 2023年6月11日
    070
  • 号称能将STW干掉1ms以内的Java垃圾收集器ZGC到底是个什么东西?

    ZGC介绍 ZGC(The Z Garbage Collector)是JDK 11中推出的一款追求极致低延迟的实验性质的垃圾收集器,它曾经设计目标包括: 停顿时间不超过10ms; …

    数据库 2023年6月16日
    0125
  • 【运维】– Docker基础必知必会(1)

    1.Docker简介 Docker的出现简单地说就是为了解决运行环境和软件配置相关的不一致性问题,采用Docker镜像的方式将软件所需要的运行环境打包。通过Docker build…

    数据库 2023年6月6日
    093
  • 读取Excel示例

    博客园 :当前访问的博文已被密码保护 请输入阅读密码: Original: https://www.cnblogs.com/EasyData/archive/2011/01/26/…

    数据库 2023年6月11日
    049
  • Eureka详解系列(三)–探索Eureka强大的配置体系

    通过前面的两篇博客,我们知道了:什么是 Eureka?为什么使用 Eureka?如何使用 Eureka?今天,我们开始来研究 Eureka 的源码,先从配置部分的源码开始看,其他部…

    数据库 2023年6月6日
    0198
  • K8S的安装部署以及基础知识

    Kubernetes(K8S)概述 Kubernetes又称作k8s,是 Google在2014年发布的一个开源项目。 最初Google开发了一个叫 Borg的系统(现在命名为Om…

    数据库 2023年6月6日
    082
  • Arrays.asList()你真的知道怎么用吗?

    发现问题 前几天在看别人的项目的时候,发现一个问题,简单复现一下这个问题 // 注意这是一个Integer对象的数组哦 Integer[] arr = new Integer[]{…

    数据库 2023年6月11日
    064
  • OAuth2 Authorization Server

    基于Spring Security 5 的 Authorization Server的写法 先看演示 pom.xml <?xml version="1.0&quot…

    数据库 2023年6月14日
    0101
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球