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)

大家都在看

  • Java面试题(八)–Spring

    1 基础知识 1、说说你对Spring的理解? 1、Spring是一个开源框架,主要是为简化企业级应用开发而生。可以实现EJB可以实现的功能,Spring是一个IOC和AOP容器框…

    数据库 2023年6月16日
    089
  • Java并发

    Java并发 JAVA技术交流群:737698533 CAS compare and swap 比较并交换,cas又叫做无锁,自旋锁,乐观锁,轻量级锁 例如下面的代码,如果想在多线…

    数据库 2023年6月16日
    084
  • jieba分词java版本自定义stop_words

    背景 项目使用到jieba分词,分词部分结果产品不满意,想过滤一些不重要的高频词汇;我们是使用的结巴分词java版。maven引入如下: com.huaban jieba-anal…

    数据库 2023年6月11日
    091
  • mybatis批量操作

    List类型 Mapper.java public int updateAccount(List<orderjob> orderJobs);</orderjob&…

    数据库 2023年6月16日
    097
  • 15. 三数之和

    给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。 注意:答案…

    数据库 2023年6月16日
    075
  • Django配置redis缓存

    Django配置redis缓存 (1)首先安装django-redis pip install django-redis (2)在settings中配置如下所示: 改配置仅为示例,…

    数据库 2023年6月14日
    096
  • zabbix的基础使用

    zabbix的基础使用 创建zabbix监控服务 环境 IP 要安装的应用 服务器 192.168.111.135 lamp架构 zabbix server zabbix agen…

    数据库 2023年6月14日
    088
  • MySQL特性:ICP,Index Condition Pushdown

    ICP,Index Condition Pushdown 理解ICP特性前,先去前面理解MRR特性,了解where条件中的三阶段提取: index key、index filter…

    数据库 2023年6月16日
    083
  • 3_肯德基餐厅信息查询_动态加载_post请求

    肯德基餐厅信息查询网址:http://www.kfc.com.cn/kfccda/storelist/index.aspx import requests url = ‘http:…

    数据库 2023年6月11日
    079
  • 刚入职没多久,连夜手写了一个代码生成器,项目开发速度瞬间屌炸了!

    一、简介 最近刚入职一个新团队,还没来得及熟悉业务,甲方爸爸就要求项目要在2个月内完成开发并上线! 本想着往后推迟1个月在交付,但是甲方爸爸不同意,只能赶鸭子上架了! 然后根据业务…

    数据库 2023年6月14日
    0111
  • 一份超长的MySQL学习笔记

    前言 最近系统地学习了一边MySQL数据库的基础知识,巩固了一下以前学习的数据库查询基础,又新学习了关于索引、事务等的新内容,做了一些学习笔记。因为MySQL的学习,实操性比较强,…

    数据库 2023年5月24日
    094
  • SQL函数-聚合函数

    聚合函数 聚合函数是对一组数据进行汇总输出的函数。 输入:一组数据集合输出:单个值 举例:返回一组数据的最大值、平均数、最小、方差等操作。 常见函数举例: 1,AVG函数:返回一组…

    数据库 2023年5月24日
    0125
  • Redis进阶(一)

    通过简单的KV数据库理解Redis 分为访问模块,操作模块,索引模块,存储模块 底层数据结构 除了String类型,其他类型都是一个键对应一个集合,键值对的存储结构采用哈希表 哈希…

    数据库 2023年6月16日
    090
  • IO流学习笔记

    IO流就是以流的方式进行输入输出 IO 流 Input Output Stream(输入输出流):以流的方式进行输入输出与文件或数据交互的内容称为 IO 流,在 JDK 中 jav…

    数据库 2023年6月11日
    092
  • 二进制方式部署K8S(kubernetes)集群(测试、学习环境)-单主双从

    1. 二进制方式部署(一主多从) 1.1 环境准备 角色 IP 组件 master 10.27.134.250 kube-apiserver、kube-controller-man…

    数据库 2023年6月9日
    080
  • 【已解决】关于echarts的splitArea分割区域背景闪烁问题

    (x轴)使用时间类型(type: “time”),并且x轴使用splitArea划分后使用color属性设定分割区域颜色。同时使用dataZoom设置区域缩…

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