概述 LRU(Least Recently Used),即最近最少使用算法,它的核心思想是当缓存满时,会优先淘汰那些近期最少使用的缓存对象。...LruCache的介绍 LruCache是个泛型类,主要算法原理是把最近使用的对象用强引用存储在 LinkedHashMap中,当缓存满时,把最近最少使用的对象从内存中移除,并提供了get和put方法来完成缓存的获取和添加操作...LruCache的使用 // 设置LruCache缓存的大小,一般为当前进程可用容量的1/8 int cacheSize = (int) (Runtime.getRuntime().totalMemory...() / 8); LruCache mMemoryCache = new LruCache(cacheSize) { // 重写...LruCache的实现是使用LinkedHashMap来维护这个对象队列的。
今天我们来聊聊缓存策略相关的内容,LruCache应该说是三级缓存策略会使用到的内存缓存策略。今天我们就来扒一扒这里面的原理,同时也温故温故我们的数据结构方面的知识。...; 3.LFU(Least Frequently Used):最不经常使用。...我们举个例子,比如我们的缓存对象顺序为:(队尾)EDDCBABAEA(队头),那么如果这时候来了个A,这时候要淘汰一个对象,如果是FIFO,这时候就会淘汰的E;如果是LRU的话,这时候就会淘汰的D,因为D被使用过之后接下来再也没有被使用过了...;如果是LFU的话,那么淘汰的就是C了,因为C就被使用过一次。...来实现,我们首先看下LruCache的成员变量和构造函数: public class LruCache { private final LinkedHashMap map
概述 记得在很早之前,我有写过一篇文章Android高效加载大图、多图解决方案,有效避免程序OOM,这篇文章是翻译自Android Doc的,其中防止多图OOM的核心解决思路就是使用LruCache...但LruCache只是管理了内存中图片的存储与释放,如果图片从内存中被移除的话,那么又需要从网络上重新加载一次图片,这显然非常耗时。...那么我们先来看一下有哪些应用程序已经使用了DiskLruCache技术。...打开缓存 这样的话我们就把准备工作做好了,下面看一下DiskLruCache到底该如何使用。...感兴趣的朋友请继续阅读 Android照片墙完整版,完美结合LruCache和DiskLruCache 。
其实,在真正的项目实战当中如果仅仅是使用硬盘缓存的话,程序是有明显短板的。而如果只使用内存缓存的话,程序当然也会有很大的缺陷。...因此,一个优秀的程序必然会将内存缓存和硬盘缓存结合到一起使用,那么本篇文章我们就来看一看,如何才能将LruCache和DiskLruCache完美结合到一起。...那我们开始动手吧,新建一个Android项目,起名叫PhotoWallDemo,这里我使用的是Android 4.0的API。...10M,这样我们就把LruCache和DiskLruCache的初始化工作完成了。...这样我们就把LruCache和DiskLruCache完美结合到一起了。
序 本文主要研究一下dubbo的LRUCache th (3).jpeg LRUCache dubbo-2.7.2/dubbo-common/src/main/java/org/apache/dubbo.../common/utils/LRUCache.java public class LRUCache extends LinkedHashMap { private static...private final Lock lock = new ReentrantLock(); private volatile int maxCapacity; public LRUCache...() { this(DEFAULT_MAX_CAPACITY); } public LRUCache(int maxCapacity) { super... cache = new LRUCache(); assertThat(cache.getMaxCapacity(),
注意:LruCache是有版本限制的,低版本的sdk需要在libs文件夹添加相应的support-4v文件。...SoftReference> imageCache = new HashMap>(); private LruCache...).getMemoryClass(); int cacheSize = 1024 *1024 *memClass / 8; mMemoryCache = new LruCache...){ return localThread; } public void onReceiveMessage(int what){}; } 使用类...} }; // 实现类而且需要实现OnScrollListener接口 public void loadImage() { // 不要在这里使用
---- 有了LinkedHashMap的基础我们来看LruCache的源码就很好理解了 put /** * Caches {@code value} for {@code key}.
文章目录 LruCache 应用场景 LruCache 算法原理 LruCache 实现 LruCache 参考 LruCache 应用场景 ---- 1....数据写入缓存 : 当需要使用某个数据时 , 将该数据写入缓存 , 此时先对内存使用情况进行一次判定 ; 如果内存不足 , 需要移除缓存数据中的部分内容 , 然后再将数据写入缓存 ; 当然 , 如果缓存内存足够...LruCache 引入 : 那么如何确定删除缓存中的哪些数据呢 , 这里就需要用到 LruCache 了 ; LruCache 算法原理 ---- LRU ( Least Recently Used 最近最少使用...缓存空间没有满 : 如果缓存空间没有满 , 直接将元素放在队首 ; 缓存队列中 , 队尾的元素就是最近最少使用的元素 , 因为其一旦使用就会提升到队首 , 因此当缓存满了以后 , 就删除队尾的元素 ;..., 就将最后一个最近最少使用的元素删除 ; 2.
先来一段百度百科的“科学”解释:LRU是Least Recently Used的缩写,即最近最少使用,是一种常用的页面置换算法,选择最近最久未使用的页面予以淘汰。...w=1322&h=768&f=png&s=489145] 使用方法及结果 在项目中直接导入Glide的库,调用内部的LruCache来看看效果。...LruCache lruCache = new LruCache(2); lruCache.put("1", 1); lruCache.put("2", 2); lruCache.put...initialMaxSize * multiplier); evict(); } 也就是用于调控我们的最大容量大小,但是我觉得还是没啥用,可是是我太菜了吧,这个方法没有其他调用它的方法,是一个我们直接在使用过程中使用的...也就是最近使用的数据应该调换到最后开始的位置,他到底实在哪里进行处理的呢?
(Least Recently Used)缓存算法便应运而生,LRU是最近最少使用的算法,它的核心思想是当缓存满时,会优先淘汰那些最近最少使用的缓存对象。...LRU原理 LruCache的核心思想很好理解,就是要维护一个缓存对象列表,其中对象列表的排列方式是按照访问顺序实现的,即一直没访问的对象,将放在队头,即将被淘汰。...(队尾添加元素,队头删除元素) LruCache 其实使用了 LinkedHashMap 双向链表结构,现在分析下 LinkedHashMap 使用方法。...4. get方法 当调用LruCache的get()方法获取集合中的缓存对象时,就代表访问了一次该元素,将会更新队列,保持整个队列是按照访问顺序排序。...也就是说: 这个方法的作用就是将刚访问过的元素放到集合的最后一位 总结: LruCache的核心原理就是对LinkedHashMap 对象的有效利用。
LruCache 简介 : 内存缓存一般使用 LruCache , 在 【Android 应用开发】LruCache 简介 博客中有简要介绍 ; ① LRU 算法 : LruCache 使用 LRU (...数据结构 : 该队列使用双向链表实现 , 实际存放内存数据的是 LinkedHashMap 集合 ; // 这是定义杂 LruCache 中的内部集合 private final LinkedHashMap...* 返回 LruCache 的键和值的大小 , 单位使用用户自定义的单位 * 默认的实现中 , 返回 1 ; size 是 键值对个数 , 最大的 size 大小是最多键值对个数...* Bitmap 内存缓存 * 单纯使用 LruCache 缓存图片到内存中 */ public class BitmapLruCache { private static final String...(lruCacheMemoryByte){ /** * 返回 LruCache 的键和值的大小 , 单位使用用户自定义的单位
异步加载图片的例子,网上也比较多,大部分用了HashMap> imageCache ,但是现在已经不再推荐使用这种方式了,因为从 Android...另外,Android 3.0 (API Level 11)中,图片的数据会存储在本地的内存当中,因而无法用一种可预见的方式将其释放,这就有潜在的风险造成应用程序的内存溢出并崩溃,所以我这里用得是LruCache...来缓存图片,当存储Image的大小大于LruCache设定的值,系统自动释放内存,这个类是3.1版本中提供的,如果你是在更早的Android版本中开发,则需要导入android-support-v4的jar...和滑动过程中取消下载任务,停下来的时候才去下载这2点比较好,值得我学习,然后我就将我的项目异步加载这一块改了下,发到这里做个记录吧,以后类似的异步加载图片直接拷贝代码,提交开发的效率 这篇文章做了哪些方面的优化 使用了线程池来管理下载任务...使用LruCache来缓存图片 使用手机来缓存图片 GridView滑动的时候取消下载任务,静止的时候进行下载,GridView滑动更加的流畅 降低了代码的耦合性,结构更加的清晰,便于以后重用 接下来我们先来看看项目的结构
使用方法及结果 在项目中直接导入Glide的库,调用内部的LruCache来看看效果。...LruCache lruCache = new LruCache(2); lruCache.put("1", 1); lruCache.put("2", 2); lruCache.put...initialMaxSize * multiplier); evict(); } 也就是用于调控我们的最大容量大小,但是我觉得还是没啥用,可是是我太菜了吧,这个方法没有其他调用它的方法,是一个我们直接在使用过程中使用的...也就是最近使用的数据应该调换到最后开始的位置,他到底实在哪里进行处理的呢?...最近使用 最久未使用 动作 1 1入内存 2 1 2入内存 1 2 1入内存,交换1和2的使用频率 3 1 3入内存,内存不足,排出2 2 3 2入内存,内存不足,排出1 LruCache 主要用于缓存的处理
说回 LevelDB 源码,作为一个工业品,它使用 的 LRUCache 又做了哪些优化和变动呢?下面让我们一块来拆解下 LevelDB 中使用的 LRUCache,看看有什么不同。...本文首先明确 LRUCache 的使用方法,然后总览分析 LRUCache 的实现思路,最后详述相关数据结构的实现细节。...缓存使用 在分析 LRUCache 的实现之前,首先了解下 LRUCache 的使用方法,以明确 LRUCache 要解决的问题。...思路总览 总体上来说,LevelDB 的 LRUCache 也使用了哈希表和双向链表的实现思路,但又有些不同: 使用数组+链表处理冲突定制了一个极简哈希表,便于控制分配以及伸缩。 多线程支持。...(); ~LRUCache(); // 从构造函数分离出此参数的设置方法,可以让调用者在使用时进行灵活的调整 void SetCapacity(size_t capacity) { capacity
先来一段百度百科的“科学”解释:LRU是Least Recently Used的缩写,即最近最少使用,是一种常用的页面置换算法,选择最近最久未使用的页面予以淘汰。...使用方法及结果 在项目中直接导入Glide的库,调用内部的LruCache来看看效果。...LruCache lruCache = new LruCache(2); lruCache.put("1", 1); lruCache.put("2", 2); lruCache.put...也就是最近使用的数据应该调换到最后开始的位置,他到底是在哪里进行处理的呢?...最近使用 最久未使用 动作 1 1入内存 2 1 2入内存 1 2 1入内存,交换1和2的使用频率 3 1 3入内存,内存不足,排出2 2 3 2入内存,内存不足,排出1 LruCache 主要用于缓存的处理
运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制 。...将 LRU 翻译成大白话就是:当不得不淘汰某些数据时(通常是容量已满),选择最久未被使用的数据进行淘汰。 题目让我们实现一个容量固定的 LRUCache 。...来理解,假设我们有容量为 的 LRUCache 和 测试键值对 [1-1,2-2,3-3] ,将其按照顺序进行插入 & 查询: 插入 1-1,此时最新的使用数据为 1-1 插入 2-2,此时最新使用数据变为...2-2 查询 1-1,此时最新使用数据为 1-1 插入 3-3,由于容器已经达到容量,需要先淘汰已有数据才能插入,这时候会淘汰 2-2,3-3 成为最新使用数据 键值对存储方面,我们可以使用「哈希表」...双向链表 具体的,我们使用哈希表来存储「键值对」,键值对的键作为哈希表的 Key,而哈希表的 Value 则使用我们自己封装的 Node 类,Node 同时作为双向链表的节点。
LruCache简介 LruCache采用的缓存算法为LRU(Least Recently Used),即最近最少使用算法。...下图是LruCache预设上限为N时,将数据M写入后的数据结构。 ? 线程安全的LruCache在读写操作中,全部使用锁做临界区保护,确保缓存使用是线程安全的。...进一步分析可以确定,以上问题的核心是存放于LruCache的数据生命周期对于使用方不透明。解决这一问题的方案是为LruCache中存放的数据添加原子变量的引用计数。...不论是LruCache中还是使用方,每次获取数据指针时,即将引用计数加1;同理,不再持有数据指针时,引用计数减1。...当引用计数为0时,说明数据没有被任何使用方使用,且数据已经过期从LruCache中被删除。这时删除数据的操作是安全的。
运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制 。...将 LRU 翻译成大白话就是:当不得不淘汰某些数据时(通常是容量已满),选择最久未被使用的数据进行淘汰。 题目让我们实现一个容量固定的 LRUCache 。...可以通过 来理解,假设我们有容量为 的 LRUCache 和 测试键值对 [1-1,2-2,3-3] ,将其按照顺序进行插入 & 查询: 插入 1-1,此时最新的使用数据为 1-1 插入 2-...2,此时最新使用数据变为 2-2 查询 1-1,此时最新使用数据为 1-1 插入 3-3,由于容器已经达到容量,需要先淘汰已有数据才能插入,这时候会淘汰 2-2,3-3 成为最新使用数据 键值对存储方面...双向链表 具体的,我们使用哈希表来存储「键值对」,键值对的键作为哈希表的 Key,而哈希表的 Value 则使用我们自己封装的 Node 类,Node 同时作为双向链表的节点。
一、题目 1、算法题目 “设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。” 题目链接: 来源:力扣(LeetCode) 链接: 146....LRU 缓存 - 力扣(LeetCode) 2、题目描述 请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。...如果插入操作导致关键字数量超过 capacity ,则应该 逐出 最久未使用的关键字。 函数 get 和 put 必须以 O(1) 的平均时间复杂度运行。...lRUCache = new LRUCache(2); lRUCache.put(1, 1); // 缓存是 {1=1} lRUCache.put(2, 2); // 缓存是 {1=1, 2=2} lRUCache.get...三、总结 使用哈希表和双向链表来实现LRU缓存机制: 双向链表按照被使用的顺序存储了键值对,靠近头部的键值对是最近使用的 哈希表通过缓存数据的键值对映射到其在双向链表中的位置。
领取专属 10元无门槛券
手把手带您无忧上云