博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
LRU的java实现
阅读量:6339 次
发布时间:2019-06-22

本文共 2155 字,大约阅读时间需要 7 分钟。

import java.util.concurrent.ConcurrentHashMap;public class LRUCache {    private ConcurrentHashMap
hashMap = new ConcurrentHashMap<>(); private int capacity;//容量 private LRUNode head;//头 private LRUNode tail;//尾 /** * 设置缓存 * * @param key 键 * @param value 值 */ public void set(String key, Object value) { LRUNode node = hashMap.get(key); if (node != null) { node.value = value; remove(node, false); } else { node = new LRUNode(key, value); if (hashMap.size() >= capacity) { // 每次容量不足时先删除最久未使用的元素 remove(tail, true); } hashMap.put(key, node); } // 将刚添加的元素设置为head setHead(node); } /** * 取缓存 * * @param key 键 * @return 值 */ public Object get(String key) { LRUNode node = hashMap.get(key); if (node != null) { // 将刚操作的元素放到head remove(node, false); setHead(node); return node.value; } return null; } private void setHead(LRUNode node) { // 先从链表中删除该元素 if (head != null) { node.next = head; head.prev = node; } head = node; if (tail == null) { tail = node; } } // 从链表中删除此Node,此时要注意该Node是head或者是tail的情形 private void remove(LRUNode node, boolean flag) { if (node.prev != null) { node.prev.next = node.next; } else { head = node.next; } if (node.next != null) { node.next.prev = node.prev; } else { tail = node.prev; } node.next = null; node.prev = null; if (flag) { hashMap.remove(node.key); } } public LRUCache(int capacity) { this.capacity = capacity; } private class LRUNode { String key; Object value; LRUNode prev; LRUNode next; private LRUNode(String key, Object value) { this.key = key; this.value = value; } }}复制代码

转载于:https://juejin.im/post/5d033c40f265da1bc07e35dc

你可能感兴趣的文章
cpu进程调度---RT Throttling【转】
查看>>
在MapGuide 的Fusion Viewer的选择面板中显示超链接
查看>>
mysql数据库开启慢查询日志
查看>>
CentOS7下单机部署RabbltMQ环境的操作记录
查看>>
unity shader tags
查看>>
ios中调用WCF
查看>>
Tomcat 配置
查看>>
挺有意思的,队列,先进先出,排队进行!
查看>>
pom-4.0.0.xml中心仓库
查看>>
C# 视频监控系列(8):服务器端——预览和可被客户端连接
查看>>
PostgreSQL在何处处理 sql查询之三十四
查看>>
怎么设计一个好的数据库
查看>>
Oracle中 存储过程 语句介绍
查看>>
[LeetCode] Trips and Users 旅行和用户
查看>>
写自己的CSS框架 Part2:跨越浏览器的reset
查看>>
pycharm开发python 在python Console中输出的程序有乱码,含有中文的输出
查看>>
EasyUI Pagination 分页的两种做法
查看>>
java中有类似C#里ref或out的功能吗?
查看>>
利用 Visual C# .NET 使 Word 自动新建文档
查看>>
Asp.net中利用ExecuteNonQuery()执行存储过程返回-1解决方案
查看>>