LRU简单实现

介绍

LRU是Least Recently Used的缩写,即最近最少使用,是一种常用页面置换算法,选择最近最久未使用的页面予以淘汰。

编码实现(高手绕行)

了解LRU的应该都其低层实现的数据结构主要是是Map和链表,如下:

package com.zte.sdn.oscp.xls.read;import lombok.Data;import java.util.Map;import java.util.concurrent.ConcurrentHashMap;public class LRU {/**LRU存在数据容量**/ private int capacity = 5; /**主要用以快速判断是否存在数据**/ private Map nodeMap = new ConcurrentHashMap(); private Node tail; private Node head; public LRU() { tail = new Node(); head = new Node(); tail.pre = head; head.nex = tail; tail.nex = null; head.pre = null; } public String getValue(String key) { String result = null; if (nodeMap.containsKey(key)) { Node node = nodeMap.get(key); result = node.value; //刷新位置(移动到头) removeNode(node); addHead(node); } return result; } public void putValue(String key, String value) { if (nodeMap.containsKey(key)) { Node node = nodeMap.get(key); node.setValue(value); //刷新位置(移动到头) removeNode(node); addHead(node); } else { Node node = new Node(); node.setValue(value); if (nodeMap.size() < capacity) { addHead(node); } else { removeNode(tail.pre); addHead(node); } nodeMap.put(key,node); } } private void addHead(Node node) { node.nex = head.nex; node.nex.pre = node; head.nex = node; node.pre = head; } private void removeNode(Node node) { node.pre.nex = node.nex; node.nex.pre = node.pre; } @Override public String toString() { StringBuffer output = new StringBuffer(); Node node = head.nex; while (node != null && node.nex != null) { output.append(node.value).append(","); node = node.nex; } return output.toString(); } @Data class Node { private String value; private Node pre; private Node nex; } public static void main(String[] args) { LRU lru = new LRU(); lru.putValue("1", "1"); lru.putValue("2", "2"); lru.putValue("3", "3"); lru.putValue("4", "4"); System.out.println("4:" + lru); lru.putValue("5", "5"); System.out.println("5:" + lru); lru.putValue("6", "6"); System.out.println("6:" + lru); lru.putValue("4", "44"); System.out.println("7:" + lru); String value = lru.getValue("2"); System.out.println("8:" + lru); }}

LinkedHashMap实现

JDK中提供了LinkedHashMap数据结构,LinkedHashMap底层就是用的HashMap加双向链表实现的,而且本身已经实现了按照访问顺序的存储。此外,LinkedHashMap中本身就实现了一个方法removeEldestEntry用于判断是否需要移除最不常读取的数,方法默认是直接返回false,不会移除元素,所以需要重写该方法。即当缓存满后就移除最不常用的数

public class LRU { private static final float hashLoadFactory = 0.75f; private LinkedHashMap map; private int cacheSize; public LRU(int cacheSize) { this.cacheSize = cacheSize; int capacity = (int)Math.ceil(cacheSize / hashLoadFactory) + 1; map = new LinkedHashMap(capacity, hashLoadFactory, true){ private static final long serialVersionUID = 1; @Override protected boolean removeEldestEntry(Map.Entry eldest) { return size() > LRU.this.cacheSize; } }; } public synchronized V get(K key) { return map.get(key); } public synchronized void put(K key, V value) { map.put(key, value); } public synchronized void clear() { map.clear(); } public synchronized int usedSize() { return map.size(); } public void print() { for (Map.Entry entry : map.entrySet()) { System.out.print(entry.getValue() + “–“); } System.out.println(); }}

郑重声明:本文内容及图片均整理自互联网,不代表本站立场,版权归原作者所有,如有侵权请联系管理员(admin#wlmqw.com)删除。
(0)
用户投稿
上一篇 2022年6月13日
下一篇 2022年6月13日

相关推荐

  • 福建省发布2022年度数字技术创新应用场景

    数字经济的发展离不开应用场景的驱动。7月24日,在第五届数字中国建设峰会数字福建分论坛上,福建省数字办发布248项数字技术创新应用场景,其中:应用场景建设需求37项,应用场景解决方…

    2022年7月27日
  • 袁立低调出行,素色穿搭难掩发福身材,短发造型十分帅气

    成熟女性的穿搭大部分以休闲大气为主,无论是重要的活动场合还是日常私服,潇洒随性是她们风格的代表。袁立这身造型可以算是典型和代表,简单的色系组合看起来十分帅气,甚至带来的女性气息很弱…

    2022年8月7日
  • “探火”一年间 天问一号有何收获?备受世界关注

    “探火”一年间 天问一号有何收获? 2021年5月15日,中国首次火星探测任务天问一号探测器在火星成功着陆,首次在火星留下中国印记。一年多的时间里,从发射、环绕到着陆、巡视,天问一…

    2022年8月16日
  • 比亚迪7月“刀锋”出鞘,实力跻身世界500强

    每年春节过后的一个月,以及5—8月份之间,都是大多数人普遍认知的汽车市场淡季时期,尤其是二月和七月,绝大多数情况下,是全年销量最低的两个月。进入8月份,造车新势力的销量纷纷出炉,8…

    2022年8月8日
  • 一个坏消息来了,下周一,A股行情预判

    炒股,永远都在风险之中,这个位置市场充满不确定性,外围不稳定,疫情反复,业绩披露窗口,很难出现持续大涨。行情充满变数,K线也充满不确定性,保留一颗敬畏之心。 对于后市,下半年的行情…

    2022年8月8日
  • 阔腿裤早就不兴了,今夏流行的是“烟管裤”,显瘦、增高又时髦

    我发现好多姐妹的衣橱中大多数都是阔腿裤,不得不承认这条裤子在近年来的时尚圈中确实是霸屏般的存在,每个人的衣橱中都有好几条款式不同,材质不同的裤子,而且这些阔腿裤的搭配都非常洋气,但…

    2022年6月5日
  • 今天微博热搜前十名(微博热搜榜在哪里看)

    早前,北京网信办约谈新浪微博负责人,针对微博干扰网上传播秩序以及传播违法、违规信息等问题,责令其立即整改,暂停更新微博热搜榜和热门话题榜一周。然而在饱受争议的微博热搜背后,还有不少…

    2022年11月15日
  • 下半年中央会对哪些投资领域开“绿灯”?

    推出“绿灯”案例,开启平台经济投资增量空间。此前中央多次提及为资本设置“红绿灯”,既要开“红灯”(防止资本无序扩张),也要开“绿灯”(鼓励资本有序发展),而此次中央政治局会议首次提…

    2022年8月26日
  • 8月24日复盘 指数全天下跌 两市超4400只个股飘绿

    【大盘】指数大幅下挫,创业板跌近3% 上证指数跌1.86% 报收3215.20点 深证成指跌2.88% 报收12096.39点 创业板指跌3.64% 报收2679.05点 两市超4…

    2022年8月25日
  • 曾凡博“不三不四”网红球员?最好嘴下留情日后免不了排队道歉

    回到CBA之前,曾凡博的NBA夏联表现未免让人有些大失所望,失望之余更增添了一份厌恶。 那是在曾凡博高调宣布参加NBA选秀之后,在经纪公司的运作下参加的比赛,与他一同征战夏联的还有…

    2022年8月22日

联系我们

联系邮箱:admin#wlmqw.com
工作时间:周一至周五,10:30-18:30,节假日休息