美文网首页
LruCache原理,底层使用什么实现的

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

作者: 清阳_ | 来源:发表于2019-05-02 23:59 被阅读0次
    LruCache(Least Recently Used)算法的核心思想就是最近最少使用算法。

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

    image

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

    队列尾部存储的数据就是我们最近最少使用的数据,当我们内存满时,就优先删除。
    LruCache内部原理的实现需要用到LinkHashMap来存储数据
    因为LinkHashMap内部是一个数组加双项链表的形式来存储数据,他能保证存进去的数据和拿出来的数据的顺序的一致性。
    并且,当我们调用get方法时,数据会从队列中跑到对头
    
    public static final void main(String[] args) {
    LinkedHashMap<Integer, Integer> 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<Integer, Integer> 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<String,Bitmap> lruCache = new LruCache<String,Bitmap>(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原理,底层使用什么实现的

          本文链接:https://www.haomeiwen.com/subject/fanonqtx.html