首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

LinkedHashMap实现简单的LRU缓存

缓存的基本假设是,数据会被多次访问,一般访问数据时,都先从缓存中找,缓存中没有再从主存中找,找到后,再放入缓存,这样,下次如果再找相同数据,访问就快了。...LRU是一种流行的替换算法,它的全称是Least Recently Used,最近最少使用,它的思路是,最近刚被使用的很快再次被用的可能性最高,而最久没被访问的很快再次被用的可能性最低,所以被优先清理。...import java.util.LinkedHashMap; import java.util.Map; /** * Created by 11 on 2017/5/18. */ public...class LRUCache extends LinkedHashMap { private int maxEntries; public LRUCache(int...cache.put("d", "call"); System.out.println(cache); } } 输出结果: {c=call, a=abstract, d=call} 参考链接:剖析LinkedHashMap

33720

深入理解LinkedHashMapLRU缓存

今天我们来深入探索一下LinkedHashMap的底层原理,并且使用linkedhashmap实现LRU缓存。 摘要: HashMap双向链表合二为一即是LinkedHashMap。...的先后顺序来迭代元素(LinkedHashMap根据双向链表重写了迭代) //同时,新put进来的Entry是最近访问的Entry,把其放在链表末尾 ,也符合LRU算法的实现 e.addBefore...的先后顺序来迭代元素(LinkedHashMap根据双向链表重写了迭代) //同时,新put进来的Entry是最近访问的Entry,把其放在链表末尾 ,也符合LRU算法的实现 e.addBefore...使用LinkedHashMap实现LRU算法   如下所示,笔者使用LinkedHashMap实现一个符合LRU算法的数据结构,该结构最多可以缓存6个元素,但元素多余六个时,会自动删除最近最久没有被使用的元素...实现LRU可以直接实现继承linkedhashmap并重写removeEldestEntry方法来设置缓存大小。jdk中实现了LRUCache也可以直接使用。

43230
您找到你想要的搜索结果了吗?
是的
没有找到

Java集合详解5:深入理解LinkedHashMapLRU缓存

的底层原理,并且使用linkedhashmap实现LRU缓存。...的先后顺序来迭代元素(LinkedHashMap根据双向链表重写了迭代) //同时,新put进来的Entry是最近访问的Entry,把其放在链表末尾 ,也符合LRU算法的实现 e.addBefore...的先后顺序来迭代元素(LinkedHashMap根据双向链表重写了迭代) //同时,新put进来的Entry是最近访问的Entry,把其放在链表末尾 ,也符合LRU算法的实现 e.addBefore...使用LinkedHashMap实现LRU算法   如下所示,笔者使用LinkedHashMap实现一个符合LRU算法的数据结构,该结构最多可以缓存6个元素,但元素多余六个时,会自动删除最近最久没有被使用的元素...实现LRU可以直接实现继承linkedhashmap并重写removeEldestEntry方法来设置缓存大小。jdk中实现了LRUCache也可以直接使用。

1.3K00

手把手教你用LinkedHashMap打造FIFOLRU缓存系统

对于缓存来说,我相信很多人都不会陌生。一般的,对于常用的一些数据,基础数据等,也或者是为了高并发,比如抢购等把热点数据放入缓存中以实现高并发快速响应。...今天我们一起来通过 LinkedHashMap 来打造两个 FIFO LRU 机制的缓存系统。 FIFO 很好理解,就是 First In First Out,先入先出。...根据这个 FIFO 的这个特点,我们就可以通过 LinkedHashMap实现这种机制的缓存系统了。 ? 上面几行代码就搞定了 FIFO 机制的缓存。测试代码也很简单,如下所示: ?...通过上面这个测试结果,可以看出,这个缓存系统并不完美。当我更新元素后,我想让它重新插入队列,相当于重新入队。因为它刚刚被更新过,说明使用频次可能更高一些。于是 LRU,这种缓存淘汰机制就应用而生了。...实现代码如下所示: ? 下面我们来看看测试代码: ? 运行之后的效果截图如下所示: ? 关于缓存算法,还有 LFU 算法。这个代码较多,我后面单独来实现

63440

JavaAndroid的LRU缓存实现原理

一、概述 Android提供了LRUCache类,可以方便的使用它来实现LRU算法的缓存。...Java提供了LinkedHashMap,可以用该类很方便的实现LRU算法,Java的LRULinkedHashMap就是直接继承了LinkedHashMap,进行了极少的改动后就可以实现LRU算法。...二、Java的LRU算法 Java的LRU算法的基础是LinkedHashMapLinkedHashMap继承了HashMap,并且在HashMap的基础上进行了一定的改动,以实现LRU算法。...LinkedHashMap就是通过header的双向链表来实现LRU算法的。header.after永远指向最近最不常使用的那个节点,删除的话,就是删除这个header.after对应的节点。...三、Android的LRU算法 Android同样提供了HashMapLinkedHashMap,而且总体思路有些类似,但是实现的细节明显不同。

88210

缓存淘汰算法与 python 中 lru_cache 装饰实现

先进先出 — FIFO FIFO 即 First In First Out 的缩写,这可以说是实现起来最简单的一种算法了。 缓存维护一个队列,总是在队首插入数据,当缓存区满时,则删除队尾数据。...LRU实现 — python 标准库 functools.lru_cache 装饰实现 python 标准库中的 functools.lru_cache 装饰实现了一个 LRU 算法的缓存,用来缓存方法所有参数与返回值的对应关系...关于 python 的闭包与装饰,参考此前的文章: python 的闭包特性 python 中的装饰及其原理 3.1....通过缓冲区与环形双向链表的同步操作完成 LRU 算法的实现。...】 此时需要触发 LRU 缓存淘汰算法,此时将 root 的 key 与 result 分别赋值为待插入节点对应的值,向后移动 root,将 root 的 key、result 分别赋值为 None,从而实现

45420

动手实现 LRU 算法,以及 Caffeine Redis 中的缓存淘汰策略

那天我在 LeetCode 上刷到一道 LRU 缓存机制的问题,第 146 题,难度为中等,题目如下。 运用你所掌握的数据结构,设计实现一个 LRU (最近最少使用) 缓存机制。...我一看这题我熟啊,当初看 LinkedHashMap源码的时候,源码中有注释提到了它可以用来实现 LRU 缓存。原文是这么写的。...LinkedHashMap这种结构非常适合构造 LRU 缓存。 当我看到这段注释的时候,特意去查了一下用 LinkedHashMap实现 LRU 的方法。...LRU 简单实现 你以为这么简单就完了吗,并没有。当我查看官方题解的时候,发现里面是这么说的。 在 Java 语言中,同样有类似的数据结构 LinkedHashMap。...面试官的要求是考考你 LRU 的原理,让你自己实现一个。 那咱们就由LinkedHashMap介绍一下最基础的 LRU 实现

72430

Java集合详解6:这次,从头到尾带你解读Java中的红黑树

的底层原理,并且使用linkedhashmap实现LRU缓存。...的先后顺序来迭代元素(LinkedHashMap根据双向链表重写了迭代) //同时,新put进来的Entry是最近访问的Entry,把其放在链表末尾 ,也符合LRU算法的实现 e.addBefore...的先后顺序来迭代元素(LinkedHashMap根据双向链表重写了迭代) //同时,新put进来的Entry是最近访问的Entry,把其放在链表末尾 ,也符合LRU算法的实现 e.addBefore...使用LinkedHashMap实现LRU算法   如下所示,笔者使用LinkedHashMap实现一个符合LRU算法的数据结构,该结构最多可以缓存6个元素,但元素多余六个时,会自动删除最近最久没有被使用的元素...实现LRU可以直接实现继承linkedhashmap并重写removeEldestEntry方法来设置缓存大小。jdk中实现了LRUCache也可以直接使用。

79300

深入浅出Java中的数据结构:LinkedHashMap详解

因此,LinkedHashMap需要重写HashMap的迭代实现按照访问顺序迭代元素的功能。   ...在LinkedHashMap中,Entry节点继承了HashMap的Node类,并且新增了beforeafter指针,因此LinkedHashMap需要重写HashMap的迭代实现按照访问顺序来迭代元素...下面以LRU缓存为例,介绍LinkedHashMap的应用。   在实现LRU缓存时,可以使用LinkedHashMap来存储数据,最近访问的元素会被移动到链表的尾部,最老的元素位于链表的头部。...优缺点分析 LinkedHashMap相对于HashMap的优点在于: 可以按照插入顺序访问顺序迭代元素。 通过维护一个双向链表,可以实现LRU缓存等有序存储访问的场景。...LinkedHashMap可以应用在需要有序存储访问的场景,比如LRU缓存、打印日志、调试信息存储等。

40351

【Java入门提高篇】Day28 Java容器类详解(十)LinkedHashMap详解

的插入删除   4、LinkedHashMap的源码分析   5、基于LinkedHashMap实现LRU缓存   6、总结   本文预计需食用二十分钟,请各位食客合理分配时间。...先看看迭代类,在LinkedHashMap中,也在内部实现了自己的迭代,内部迭代都继承自LinkedHashIterator类,该类代码如下: abstract class LinkedHashIterator...基于LinkedHashMap实现LRU缓存   首先还是对LRU缓存做一个相对简单的介绍:   LRU(Least recently used,最近最少使用)算法根据数据的历史访问记录来进行淘汰数据,...当我们使用LinkedHashMap实现LRU缓存时,可以通过覆写removeEldestEntry方法可以实现自定义策略的 LRU 缓存。...这种地图非常适合构建LRU缓存

95420

理解LinkedHashMap

LinkedHashMap是Map接口的哈希表链接列表实现,具有可预知的迭代顺序。此实现提供所有可选的映射操作,并允许使用null值null键。...LinkedHashMap实现与HashMap的不同之处在于,后者维护着一个运行于所有条目的双重链接列表。此链接列表定义了迭代顺序,该迭代顺序可以是插入顺序或者是访问顺序。...在上述HashMap的构造中,最后会调用init()方法,进行相关的初始化,这个方法在HashMap的实现中并无意义,只是提供给子类实现相关的初始化调用。...,这种映射很适合构建LRU缓存。...使用LinkedHashMap构建LRU的Cache http://tomyz0223.iteye.com/blog/1035686 基于LinkedHashMap实现LRU缓存调度算法原理及应用 http

54210

聊聊java中的哪些Map:(四)LinkedHashMap源码分析

特殊的构造函数LinkedHashMap(int,float,boolean)用于创建迭代顺序为上次访问顺序的链表hash结构。从最近最少访问到最近访问,这种map很时候构建LRU缓存。...由此可以看出,LinkedHashMap实际上兼顾了HashMap链表的优点,默认情况下可以按照插入序构建链表,另外,还可以做为LRU缓存使用。...,因为如果我们要通过LinkedHashMap实现一个LRU缓存,那么必须采用这个构造函数,将accessOrder指定为true。...也就是说,LinkedHashMap本身并不提供删除最老元素的实现,如果要实现LRU缓存,对老元素进行删除的话,可能这个方法需要我们自己重写来实现。...比如在某些情况下,实现一个基于LRU缓存,虽然LinkedHashMap本身没有提供删除元素的方法,但是我们可以根据list的长度自行控制,利用accessorder的特性,将超过一定长度的head元素删除

42750

Java中常见数据结构Map之LinkedHashMap

LinkedHashMap是Map接口的哈希表链接列表实现,具有可预知的迭代顺序。此实现提供所有可选的映射操作,并允许使用null值null键。...LinkedHashMap实现与HashMap的不同之处在于,后者维护着一个运行于所有条目的双重链接列表。此链接列表定义了迭代顺序,该迭代顺序可以是插入顺序或者是访问顺序。 注意,此实现不是同步的。...实现LRU算法缓存 前面讲了LinkedHashMap添加元素,删除、修改元素就不说了,比较简单,HashMap+LinkedList的删除、修改元素大同小异,下面讲一个新的内容。...算法的Cache(缓存),这个类继承自LinkedHashMap,而类中看到没有什么特别的方法,这说明LRUCache实现缓存LRU功能都是源自LinkedHashMap的。...LinkedHashMap可以实现LRU算法的缓存基于两点: 1、LinkedList首先它是一个Map,Map是基于K-V的,和缓存一致 2、LinkedList提供了一个boolean值可以让用户指定是否实现

1.1K30

LinkedHashMap实现原理(复习)

LinkedHashMap概述:    LinkedHashMap是Map接口的哈希表链接列表实现,具有可预知的迭代顺序。此实现提供所有可选的映射操作,并允许使用null值null键。...LinkedHashMap实现与HashMap的不同之处在于,后者维护着一个运行于所有条目的双重链接列表。此链接列表定义了迭代顺序,该迭代顺序可以是插入顺序或者是访问顺序。   ...在上述HashMap的构造 中,最后会调用init()方法,进行相关的初始化,这个方法在HashMap的实现中并无意义,只是提供给子类实现相关的初始化调用。   ..., loadFactor);   this.accessOrder = accessOrder;   }       该哈希映射的迭代顺序就是最后访问其条目的顺序,这种映射很适合构建LRU缓存。...如果用此映射构建LRU缓存,则非常方便,它允许映射通过删除旧条目来减少内存损耗。    例如:重写此方法,维持此映射只保存100个条目的稳定状态,在每次添加新条目时删除最旧的条目。

64840

蚂蚁金服在线笔试:设计实现一个LRU(最近最少使用)缓存机制

/) 运用你所掌握的数据结构,设计实现一个 LRU (最近最少使用) 缓存机制 。...实现 LRUCache 类: LRUCache(int capacity) 以正整数作为容量 capacity 初始化 LRU 缓存 int get(int key) 如果关键字 key 存在于缓存中,...题目要求的12相对简单,主要是条件3,当缓存容量达到上限时,它应该在写入新数据之前删除最久未使用的数据值。容量条件1相呼应,关键是怎么理解最久未使用呢?...缓存 不断调整玩具位置,从仓库中取玩具放到摊位从摊位放回仓库,可以理解为条件二三 开始撸起来......数组&&对象实现方式 var LRUCache = function (capacity) { // 用数组记录读写的顺序 this.keys = [] // 用对象来保存key value

66120
领券