LruCache,DiskLruCache实现分析

LinkHashMap(关键的数据结构)

最新的元素指向头表(头表前一个元素,Tail)(头表后一个元素指向最老的元素)在构造器中,head.nxt=head.prv,此时链表为空

LinkedHashMap#makeTail Lru算法关键

将元素插入到头表前一个元素(离头表最近的元素,也是最新的元素),此方法在get和put中会被调用

LinkedHashMap实现了HashMap的preModify和postRemove方法,在这两个方法中将元素以链表的形式(LinkedEntry)链接起来,这两个方法分别对应put和remove。LinkedHashMap重写了get方法,实现方式是在Map的基础上添加了makeTail方法


HashMap remove方法

第一次循环,pre=null e=头结点

if判断里边:条件:hash相同且key值相同 表示:要删除的元素找到了

如果pre为Null代表要删除的是头节点,将该位置转向存放当前节点下一个,并删除当前节点

如果pre不为空,代表当前的e是要删除的目标,pre指向e的上一个节点,为了删除e,将pre指向e的下一个,将e放空,然后删除之

HashMap 遍历原理

三种Iterator都继承HashIterator

在iterator()方法中会创建KeyIterator对象,KeyIterator继承HashIterator,由于KeyIterator没有重写构造函器,于是会调用HashIterator的构造器,在HashIterator构造器中会遍历Entry的数组(table),从0找到第一个不为空的Entry,记为nextEntry

在next()方法中会调用HashIterator的nextEntry(),在nextEntry()方法中会先记录当前nextEntry的值,然后判断nextEntry.next是否为空(Entry是一个链表,链表链接的是通过hash算出的地址相同的元素(hash冲突)Entry.next可以获得下一个地址相同的元素),如果是则找寻下一个不为空的index,否则直接赋值给nextEntity,最后返回刚才记录的值

HashMap计算元素下标原理

取得元素hash

将hash和table.length相与

LRUCache原理

LinkedHashMap在每次(通过key)preModify(Map中put方法调用)和(通过key)get时都会调用makeTail将该元素添加到链表尾部(离头表最近)

LruCache类在每次put元素到LinkedHashMap后都会调用trimToSize方法(根据每个元素的大小(通过sizeOf方法获得元素大小)算出当前总大小size,并和maxSize比较,如果大于maxSize就从LinkedHashMap头部开始删除(离头表最远的header.nxt),每删除一次就比较一下大小,直到size<=maxSize为止,每次删除都会调用LinkedHashMap重写的postRemove方法将元素断链,entrySet()和next()方法的重写使得迭代器从离头表最远处开始删除元素)调整元素数量,LruCache的自动删除使内存占用达到平衡,并由于LinkedHashMap的特性,使得每次删除的都是使用最少的元素,保证了高频元素的留存性


DiskLruCache理解

journalFile:提供缓存目录信息,记录读写操作的文件,用来提供删除依据

open方法:建立缓存目录和journalFile文件

Editor:用来提供写入操作相关功能

LinkedHashMap:文件信息的缓存,通过journalFile获得,通过该缓存信息决定要删除的文件顺序

原理:

建立缓存目录,通过journalFile记录每次操作,用LinkedHashMap缓存操作的文件名空间等信息,根据journalFile里面包含的信息获得LinkedHashMap,遍历LinkedHashMap并根据占用大小移除排在LinkedHashMap离头表远的文件,原理和LruCache是一样的,只不过需要先(通过journalFile)读取一遍缓存文件的信息,以确定LinkedHashMap中文件元素的位置而已

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值