LruCache原理
2018-12-08 本文已影响0人
钟离四郎
创建LruCache对象,重写其中的sizeOf方法:
![](https://img.haomeiwen.com/i4447058/f4cf089e78d69549.png)
然后看看LruCache内部长啥样子???
![](https://img.haomeiwen.com/i4447058/6a7e533f7ec169cb.png)
看到A处,这里有个LinkedHashMap,这个是专门来存要缓存的对象,这个数据结构有个特点即链表+HashMap,HashMap是无序的,而LinkedHashMap是有序的,插入顺序与输出顺序相同,它还一个特点就是可以根据访问顺序排序,这个特点很重要,后期缓存满的时候要移除“最近最少使用”的缓存对象就很方便了,如下:
![](https://img.haomeiwen.com/i4447058/8bf06b56ccb8a7a0.png)
如果你对LinkedHashMap不了解可以看下这片文章:LinkedHashMap 的实现原理
接下来目光移到B处,看看LruCache的put方法:
![](https://img.haomeiwen.com/i4447058/bd26e9b14eb8aa51.png)
看到标记D处,trimToSize方法:
![](https://img.haomeiwen.com/i4447058/f3020e2e5b80503d.png)
看完put,再来看看get方法:
![](https://img.haomeiwen.com/i4447058/a6cca66655e9b0b2.png)
接上图看下,mapValue为null又做些什么呢?如下:
![](https://img.haomeiwen.com/i4447058/d29f5b90adc48651.png)
总结
LruCache能够按照最近最少使用的思想来缓存对象,在于其内部使用了LinkedHashMap这种数据结构来缓存对象,这种数据结构有个主要特点:插入顺序与输出顺序相同,同时还能够根据访问顺序排序,理解这一点,再去看put、get源码就很简单了,总的来说LruCache的源码也是很简单的。