LruCache原理,底层使用什么实现的

LruCache(Least Recently Used)算法的核心思想就是最近最少使用算法。

他在算法的内部维护了一个LinkHashMap的链表,通过put数据的时候判断是否内存已经满了,如果满了,则将最近最少使用的数据给剔除掉,从而达到内存不会爆满的状态。这么讲可能有些抽象,我从网上找了一张图来解释这个算法。

LruCache原理,底层使用什么实现的_第1张图片
image

LruCache算法内部其实是一个队列的形式在存储数据,先进来的数据放在队列的尾部,后进来的数据放在队列头部。如果要使用数据,就在把数据放到队列头部。如果要存储数据,但是发现数据已经满了,这是就删除队列尾部的数据,然后缓存新数据。

队列尾部存储的数据就是我们最近最少使用的数据,当我们内存满时,就优先删除。
LruCache内部原理的实现需要用到LinkHashMap来存储数据
因为LinkHashMap内部是一个数组加双项链表的形式来存储数据,他能保证存进去的数据和拿出来的数据的顺序的一致性。
并且,当我们调用get方法时,数据会从队列中跑到对头

public static final void main(String[] args) {
LinkedHashMap map = new  LinkedHashMap<>(0, 0.75f, true);
map.put(0, 0);
map.put(1, 1);
map.put(2, 2);
map.put(3, 3);
map.put(4, 4);
map.put(5, 5);
map.put(6, 6);
map.get(1);
map.get(2);

for (Map.Entry entry : map.entrySet()) {
    System.out.println(entry.getKey() + ":" + entry.getValue());

}

}

输出结果:

0:0
3:3
4:4
5:5
6:6
1:1
2:2

LruCache算法的使用

        Bitmap bitmap = null;
        //获取运行内存大小的八分之一
        int memory = (int)Runtime.getRuntime().totalMemory() / 1024;
        int cache = memory / 8;
        bitmap = BitmapFactory.decodeResource(getResources(),R.mipmap.ic_launcher);
        LruCache lruCache = new LruCache(cache){
            @Override
            protected int sizeOf(String key, Bitmap bitmap) {
                return bitmap.getRowBytes() * bitmap.getHeight() / 1024;
            }
        };
        //将数据存储进入缓存
        lruCache.put("cacheBitmap",bitmap);
 
        Bitmap cacheBitmap = lruCache.get("cacheBitmap");
        //在使用的时候判断是否图片为空,因为有可能图片因为内存空间满了而被剔除
        if (cacheBitmap != null){
            //TODO
        }

你可能感兴趣的:(LruCache原理,底层使用什么实现的)