当前位置: 首页 > news >正文

手写LRU 缓存

主要逻辑:

要有一个hashMap存储节点,实现o(1)的查找

要有一个双向链表,实现实现最近或刚添加的节点在头节点,

初始容量,每添加一个节点,就记录当前已添加的个数,如果添加之后已超过容量,则移除尾部的节点和hashMap里面的节点

public class LRUCacheDemo {class LRUNode {private int key;private int value;private LRUNode prev;private LRUNode next;public LRUNode() {}public LRUNode(int key, int value) {this.key = key;this.value = value;}}private Map<Integer, LRUNode> cache = new HashMap<>();private int capacity;private int size;private LRUNode head, tail;public LRUCacheDemo(int capacity) {this.capacity = capacity;this.size = 0;head = new LRUNode();tail = new LRUNode();head.next = tail;tail.prev = head;}public int get(int key) {LRUNode lruNode = cache.get(key);if (lruNode == null) {return -1;}moveNodeToHead(lruNode);return lruNode.value;}public void put(int key, int value) {// 从缓存中查询,如果存在,则更新value, 并把对应的node移到头部LRUNode lruNode = cache.get(key);if (lruNode != null) {lruNode.value = value;moveNodeToHead(lruNode);} else {// 如果不存在,则直接插入// 放入hashMapLRUNode node = new LRUNode(key, value);cache.put(key, node);// 添加到双向链表的头部addToHead(node);size++;// 然后看容量是否超过了,如果超过了,则移除双向链表尾部的节点,并移除cache的节点if (size > capacity) {LRUNode tail = removeTail();cache.remove(tail.key);size--;}}}private LRUNode removeTail() {LRUNode tail = this.tail.prev;removeNode(tail);return tail;}private void moveNodeToHead(LRUNode lruNode) {removeNode(lruNode);addToHead(lruNode);}private void addToHead(LRUNode lruNode) {lruNode.prev = head;lruNode.next = head.next;head.next.prev = lruNode;head.next = lruNode;}private void removeNode(LRUNode lruNode) {lruNode.prev.next = lruNode.next;lruNode.next.prev =lruNode.prev;}public static void main(String[] args) {LRUCacheDemo lruCacheDemo = new LRUCacheDemo(2);lruCacheDemo.put(1,1);lruCacheDemo.put(2,2);lruCacheDemo.get(2);lruCacheDemo.put(3, 3);lruCacheDemo.put(4, 4);lruCacheDemo.get(1);}
}

http://www.dtcms.com/a/614521.html

相关文章:

  • 23-MD5+DES+Webpack:考试宝
  • 前端构建工具环境变量,安全管理
  • 个人网站名称举例网站建设需要的硬件
  • 数据分析笔记09:Python条件语循环
  • 可在哪些网站做链接赣州网络招聘
  • 高端网站制作网站背景自动切换
  • 代码生成工具GitHub Copilot介绍
  • RDMA基本操作类型---send/recv,write/read
  • 2.37基于Multisim的数字电子钟准点报时,时间可调,Multisim时钟,Multisim电子时钟。含3000字报告。功能:带准点报时,时间可调
  • 建筑模板有哪些seo优化按天扣费
  • 广州网站设计联系方式旅游做攻略用什么网站好
  • 小华HC32L136K8TA 单片机新建 MDK5 工程模板 (一)
  • day15(11.15)——leetcode面试经典150
  • LED闪烁功能代码详解
  • 这几年做哪些网站致富基于ssh框架的网站开发流程
  • 远程(本地)连接不上虚拟机
  • Ubunntu24.04 下载jdk 8
  • SpringCache详细教学使用
  • 39Nginx的rewrite规则执行逻辑详解
  • C++—priority_queue/仿函数:优先级队列的使用及模拟实现
  • 做网站哪些dw使用模板做网站教程
  • 深圳市光明建设发展集团网站网站建设面谈话术
  • Java EE进阶5:Spring IoCDI
  • 中专生学历提升与职业发展指南
  • 易语言怎么反编译 | 如何通过反编译理解易语言的工作原理与破解技巧
  • 阿里国际站韩语网站怎么做百度帐号个人中心
  • EnsembleRetriever中的倒数融合排序算法
  • 网站客户端制作多少钱wordpress导出html
  • 银河麒麟高级服务器系统(V11)的安装部署实操保姆级教程
  • 202552读书笔记|《漫步在晴朗的日子里》——拥有一颗坚定的心去面对朝花夕拾,潮涨潮落