看看人家 - Glide的LruCache

本文探讨了Glide框架中LruCache的实现,分析了其基本操作接口、数据结构选择及实现细节,特别指出尽管使用了LinkedHashMap,但并未依赖其默认的LRU策略,而是通过手动管理内存来达到缓存效果。最后,文章总结了Glide LruCache源码的简洁性和单元测试的完善性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

看看人家 - Glide的LruCache

在这里插入图片描述

在android领域,glide是一个非常优秀的图片加载框架,优秀自然有优秀的道理,看github的star你会发现它非常受欢迎,今天有空来看看Glide中LruCache的实现,源码阅读我还是坚持这个原则:不着急关注细节,先抽取骨架,再薅皮毛

1,基本操作接口

我们在使用LRU之类的实现框架的时候,这四个方法基本概况了所有日常,加锁的原因是为了保证线程安全和数据一致。

/**
* T = key
* Y = value
*/
public class LruCache<T, Y> {
   
   
	
	/**
	* 缓存中是否包含此KEY
	*/
	public synchronized boolean contains(T key);

	/**
	* 从缓存中获取目标数据
	*/
	public synchronized Y get(T key);
	
	/**
	* 把item放入缓存
	*/
	public synchronized Y put(T key, Y item);

	/**
	* 从缓存中移除
	*/
	public synchronized Y remove(T key);
	
}

2,逃不掉的基本数据结构

我们都知道LRU大部分都使用链表这个基本数据结构来实现,但是链表的访问效率又不理想,使用LinkedHasmap是个不错的选择,我们来看下LruCache的定义。

public class LruCache<T, Y> {
   
   
	/**初始容量100,加载因子0.75,也就是说当容量达到75%,就触发扩容机制。同时按照访问顺序排序*/
  private final Map<T, Entry<Y>> cache = new LinkedHashMap<>(100, 0.75f, true);
  private final long initialMaxSize;
  private long maxSize;
  private long currentSize;
...

使用LinkedHasmap兼顾了插入,删除,访问的效率。那么我们接下来观察一下细节,先看一下put的实现。

3,实现细节

3.1 put

put分两种情况,一种是key不存在,是添加;另一种是key已经存在,就替换。

  public synchronized Y put(@NonNull T key, @Nullable Y item) {
   
   
  	//itemSize始终为1
    final int itemSize = getSize(item);
    //边界处理,我们的LruCache容量初始化的时候不能为1
    if (itemSize >= maxSize) {
   
   
    	//这个onItemEvicte
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值