LruCache原理:
维护一个缓存对象列表,按照访问顺序进行对象排列,就是将一直没有访问的对象放到队尾,即将淘汰。而最近访问的对象放在队头,最后淘汰。而这个队列主要是通过LinkedHashMap实现。
LinkedHashMap:(默认为插入排序,即输入与输出顺序一致)
继承于HashMap,使用双向链表来存储Map中的Entry顺序关系。顺序有2,一是访问顺序,一是插入顺序,可以由其构造方法LinkedHashMap(int initialCapacity,float loadFactor,boolean accessOrder:true表示顺序访问,false是插入排序)指定。所以,get,put,remove等操作,它除了做HashMap的操作,还需要调整Entry顺序列表的工作。
Android中的LruCache将LinkedHashMap中的默认顺序设置为访问顺序,每次调用get,则将该对象移到链表的头部,调用put插入新的对象到链表头部。当内存缓存达到最大值时,就将链表尾部的对象移除。每次put或者remove,都需要判断缓存大小是否足够trimToSize。
注:链表头部-最近使用或者插入的;链表尾部-最近很少使用的。
本文图片来自于网络,若有侵权请联系本人,必删!