LruCache 应用场景
1. 缓存需求 : 处理大量数据时 , 为了提升性能 , 需要对其中的部分数据进行缓存 ; 涉及到使用缓存 , 和删除内存缓存操作 , 使缓存的数据大小保持在一个稳定的水平 ;
2. 数据写入缓存 : 当需要使用某个数据时 , 将该数据写入缓存 , 此时先对内存使用情况进行一次判定 ; 如果内存不足 , 需要移除缓存数据中的部分内容 , 然后再将数据写入缓存 ; 当然 , 如果缓存内存足够 , 直接写入缓存即可 ;
3. LruCache 引入 : 那么如何确定删除缓存中的哪些数据呢 , 这里就需要用到 LruCache 了 ;
LruCache 算法原理
LRU ( Least Recently Used 最近最少使用 ) 算法 : 内部维护了一个固定大小的队列 ( 先进先出 ) ; 放入元素时根据不同的情况执行不同的策略 ;
1. 缓存中是否有该元素 : 如果缓存中有该元素 , 那么将该元素放到队列的队头 ;
2. 缓存中没有该元素 : 如果缓存中没有改元素 , 那么需要插入该元素 ;
3. 缓存空间是否已满 : 如果缓存空间满了 , 需要将队尾元素删除 , 将元素放在队首 ;
4. 缓存空间没有满 : 如果缓存空间没有满 , 直接将元素放在队首 ;
缓存队列中 , 队尾的元素就是最近最少使用的元素 , 因为其一旦使用就会提升到队首 , 因此当缓存满了以后 , 就删除队尾的元素 ;
LruCache 实现
1. Android 中的 LruCache : 其缓存空间就是一个 LinkHashMap 链表 , 当调用 put 方法向其中放入新元素时 , 就会判断这个 LinkHashMap 链表是已满 , 如果没有空间 , 就将最后一个最近最少使用的元素删除 ;
2. LinkHashMap 实现 : LinkHashMap 链表内部由数组和双向链表实现 , 其能够保证与队列一致的性质 , 即先进先出 , 并保证其插入取出顺序的一致性 ; 当调用 get 方法获取其中的元素时 , 会将该元素提取到队头中 , 这符合了 LRU 算法的要求 ;
LruCache 参考
LruCache 参考 :
① Android LruCache 文档
② 谈谈LruCache算法的底层实现原理及其内部源码
③ 完全解析Andorid的缓存机制LruCache