LruCache原理

LruCache是一个基于LinkedHashMap实现的缓存机制,主要应用于Android开发中,用于图片或者其他资源的缓存。它利用最近最少使用原则(LRU)进行淘汰策略,当缓存满时,会移除最久未使用的数据。本文详细介绍了LruCache的工作原理、使用方法以及源码分析,包括构造函数、put和get方法的实现。
摘要由CSDN通过智能技术生成

1、原理

缓存保存了一个强引用(Android 2.3开始,垃圾回收器更倾向于回收弱引用和软引用,软引用和弱引用变得不可靠,Android 3.0中,图片的数据会存储在本地的内存当中,因而无法用一种可预见的方式将其释放)限制值的数量. 每当值被访问的时候,它会被移动到队列的头部. 当缓存已满的时候加入新的值时,队列中最后的值会出队,可能被回收

LRUCache内部维护主要是通过LinkedHashMap实现

这是一个安全的线程,多线程缓存通过同步实现

 

2、使用

默认情况下,缓存的大小是由值的数量决定,重写sizeOf计算不同的值

如果你缓存值需要明确释放,重写entryRemoved()

int maxMemory = (int) Runtime.getRuntime().maxMemory();    
int mCacheSize = maxMemory / 8;  
//给LruCache分配1/8 4M  
mMemoryCache = new LruCache<String, Bitmap>(mCacheSize){  

  //必须重写此方法,来测量Bitmap的大小  
  @Override  
  protected int sizeOf(String key, Bitmap value) {  
       return value.getRowBytes() * value.getHeight();  
  }  

};
mMemoryCache.put(key, bitmap)
mMemoryCache.get(key)
这个类不允许有空的键值. get,put,remove 返回空值,key对应的值不在缓存中

3、源码分析

构造函数

/** 
  * @param maxSize for caches that do not override {@link #sizeOf}, this is 
  *     the maximum number of entries in the cache. For all other caches, 
  *     this is the maximum sum of the sizes of the entries in this cache. 
  */
public LruCache(int maxSize) {    
    if (maxSize <= 0) {        
        throw new IllegalArgumentException("maxSize <= 0");    
    }    

    this.maxSize = maxSize;   
    this.map = new LinkedHashMap<K, V>(0, 0.75f, true);
}
初始化了最大容量和LinkedHashMap

public LinkedHashMap(
        int initialCapacity, float loadFactor, boolean accessOrder) {
    super(initialCapacity, loadFactor);
    init();
    this.accessOrder = accessOrder;
}
initialCapacity:初始化hashMap的容量,这个值必须大于等于0
loadFactor:已被忽略,取值为3/4
accessOrder:如果accessOrder为true,排序是根据最近最少使用算法,如果accessOrder为false,排序是基于插入顺序

@Override void i

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值