【源码】LruCache源码剖析
来源:互联网 发布:win 2008 如何打开端口 编辑:程序博客网 时间:2024/04/27 08:04
上一篇分析了LinkedHashMap源码,这个Map集合除了拥有HashMap的大部分特性之外,还拥有链表的特点,即可以保持遍历顺序与插入顺序一致。另外,当我们将accessOrder设置为true时,可以使遍历顺序和访问顺序一致,其内部双向链表将会按照近期最少访问到近期最多访问的顺序排列Entry对象,这可以用来做缓存。
这篇文章分析的LruCache并不是jdk中的类,而是来自安卓,熟悉安卓内存缓存的必然对这个类不陌生。
LruCache内部维护的就是一个LinkedHashMap。
下面开始分析LruCache。
注:下面LruCache源码来自support.v4包。
首先是这个类的成员变量:
LinkedHashMap的初始化放在构造器中:
sizeof:这个方法用于计算每个条目的大小,子类必须得复写这个类。snapshot方法,返回当前缓存中所有的条目集合
这里将LinkedHashMap的accessOrder设置为true。
接下来看两个最重要的方法,put和get。首先是put方法:
put方法无非就是调用LinkedHashMap的put方法,但是这里在调用LinkedHashMap的put方法之前,判断了key和value是否为空,也就是说LruCache不允许空键值。除此之外,put操作被加锁了,所以是线程安全的!
既然是缓存,那么必然能够动态删除一些不常用的键值对,这个工作是由trimToSize方法完成的:
这个方法不断循环删除链表首部元素,也就是最近最少访问的元素,直到容量不超过预先定义的最大值为止。
注:LruCache在android.util包中也有一个LruCache类,但是我发现这个类的trimToSize方法是错误的:
这里的代码将会循环删除链表尾部,也就是最近访问最多的元素,这是不正确的!所以大家在做内存缓存的时候一定要注意,看trimToSize方法是否有问题。
接下来是get方法:
get方法即根据key在LinkedHashMap中寻找对应的value,此方法也是线程安全的。
以上就是LruCache最重要的部分,下面再看下其他方法:
remove:
sizeof:这个方法用于计算每个条目的大小,子类必须得复写这个类。snapshot方法,返回当前缓存中所有的条目集合
总结:
1.LruCache封装了LinkedHashMap,提供了LRU缓存的功能;
2.LruCache通过trimToSize方法自动删除最近最少访问的键值对;
3.LruCache不允许空键值;
4.LruCache线程安全;
5.继承LruCache时,必须要复写sizeof方法,用于计算每个条目的大小。
原文地址:http://blog.csdn.net/chdjj/article/details/38701509
0 0
- 【源码】LruCache源码剖析
- 【源码】LruCache源码剖析
- 深入源码剖析LruCache
- LruCache 源码剖析
- LruCache源码
- LevelDB源码剖析之Cache(HashTable LRUCache ShardedLRUCache)
- Android LruCache源码介绍
- LruCache源码解读
- LRUCache源码学习
- LruCache源码解析
- LRUCache源码解析
- Android LruCache源码详解
- android LRUCache源码分析
- LruCache源码解析
- LruCache源码的理解
- LruCache源码浅析
- LruCache源码完全解析
- LruCache源码分析
- 【杭电1070】milk (sort+结构体)
- Python3 使用bs4按标签提取贴吧楼主发表内容
- Anroid之HttpClient异步请求数据
- Eclipse中文字体太小的解决办法
- caffe学习(2):安装完caffe后,配置python接口
- 【源码】LruCache源码剖析
- 机房收费整体思路
- HDU 1827 Summer Holiday
- 矩阵论还真有用:触摸屏校准
- hdojBiker's Trip Odometer(水题)
- [INS-060001]Failed to perform operation due to internal driver error.
- JAVA socket FTPserver HTTPserver chatting RMI(Remote Method Invocation)
- An out-of-range value
- C/C++ Pointer Learning ||