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)

大家都在看

  • 一次较波折的MySQL调优

    春节假期的一天,阳光明媚,春暖花开,恰逢冬奥会开幕,想着这天一定是生肖吉日,就能顺风顺水了。没想到,我遇到了一位客户,有点波折。 [En] Spring Festival holi…

    数据库 2023年5月24日
    084
  • 配置中心的设计-nacos vs apollo

    和 apollo 一样,nacos 也是一款配置中心,同样可以实现配置的集中管理、分环境管理、即时生效等等。不过,nacos 还具备了服务发现的功能。 分析 apollo 时,我们…

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

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

    数据库 2023年5月24日
    091
  • MySQL数据库CRUD

    INSERT语句 INSERT INTO 表名 (column1,column2,column3,…)VALUES (value1,value2,value3,&#82…

    数据库 2023年6月16日
    093
  • linux ftp报530 530 Login incorrect pam_unix(crond:account): expired password for user

    今天用FTP登录服务器,要传些数据文件,一直登录不上,重启之后依然无法登陆。 就提交了工单,阿里云的售后居然在网上给我找了两篇处理530的帮助文档,直接无语! 无奈… …

    数据库 2023年6月14日
    0137
  • CentOS 7 Golang 安装

    可去官网下载tar包,这里提供一个1.16的安装地址: curl -#LO https://studygolang.com/dl/golang/go1.16.linux-amd64…

    数据库 2023年6月9日
    0123
  • JWT简介

    JWT简介 在用户注册或登录后,我们想记录用户的登录状态,或者为用户创建身份认证的凭证。我们不再使用Session认证机制,而使用Json Web Token认证机制。 (1) 什…

    数据库 2023年6月14日
    0109
  • 2022-08-17 DQL—-子查询,日期格式

    子查询、日期格式 DQL查询语言 子查询 按照结果集的行列数不同,子查询可以分为以下几类: 标量子查询:结果集只有一行一列(单行子查询) 列子查询:结果集有一列多行 行子查询:结果…

    数据库 2023年6月14日
    096
  • 测试执行和软件缺陷

    测试执行 1.基本概念 测试执行就是执行测试用例、提交Bug 单、测试结论的评估和总结等一系列测试活动,测试执行不仅包含测试用例的执行,还包括其它测试活动. 2.注意事项 (1) …

    数据库 2023年6月16日
    099
  • Linux 的基本操作 -权限

    Linux 的基本操作 -权限 权限:文件的属性: d:表示目录-:表示文件 l:连接文件 b:设备文件,提供存储的接口设备 c:设备文件,提供串行的接口设备–键盘,鼠…

    数据库 2023年6月16日
    099
  • 数据库概述

    MySQL的启动、停止 启动: net start mysql80 停止: net stop mysql80 (PS:mysql80为Win注册到MySQL中的系统服务名称)* M…

    数据库 2023年5月24日
    077
  • 解决数据库报错Error 1390: Prepared statement contains too many placeholders的问题

    今天,当您开发一个项目时,您试图一次插入大量数据,但出现了以下错误: [En] Today, when you were developing a project, you tri…

    数据库 2023年5月24日
    0110
  • linux-centos常用命令

    01-centos-常用命令 1.centos防火墙 关闭 systemctl stop firewalld 禁止开机启动防火墙 systemctl disable firewal…

    数据库 2023年6月11日
    0100
  • 小公司比较吃亏的两道微服务面试题

    其实选择工作的时候,很多技术牛人都会选择一些小而美的公司,技术全面,能够以一个更全面的视角看整个公司的运作,人和人之间的相处也很简单。但是,有两道微服务的面试题,小公司的朋友们会比…

    数据库 2023年6月6日
    0137
  • Java面试题(四)–RabbitMQ

    1、MQ有哪些使用场景?(高频) 异步处理:用户注册后,发送注册邮件和注册短信。用户注册完成后,提交任务到 MQ,发送模块并行获取 MQ 中的任务。 系统解耦:比如用注册完成,再加…

    数据库 2023年6月16日
    086
  • 开机由网络改为硬盘启动centos、windows都可用

    一台许久不开机的电脑开机后如图一直重试。 百度到原因是:系统的开机启动无意中由硬盘改成了网络,现在重新改回硬盘启动就好。 解决方法如下: 1、进入bios,各个厂家不同,有f2的、…

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