LruCache源码分析及思考

原创 2013年12月04日 17:01:14

先来看看给我印象深刻的Lrucache中的关键代码。

//得到图片大小需覆写的方法

 protected int sizeOf(K key, V value) {
        return 1;

//返回图片也就是value的占用内存的大小
    }

// 第三个是关键性参数,true的话,map在get操作的时候,如果返回不为空的话,会将当前节点移到最前端

this.map = new LinkedHashMap<K, V>(0, 0.75f, true);


LinkedHashMap源码:

 if (accessOrder)
                makeTail((LinkedEntry<K, V>) e);
            return e.value;
            /**
     * Relinks the given entry to the tail of the list. Under access ordering,
     * this method is invoked whenever the value of a  pre-existing entry is
     * read by Map.get or modified by Map.put.
     */
    private void makeTail(LinkedEntry<K, V> e) {
        // Unlink e
        e.prv.nxt = e.nxt;
        e.nxt.prv = e.prv;


        // Relink e as tail
        LinkedEntry<K, V> header = this.header;
        LinkedEntry<K, V> oldTail = header.prv;
        e.nxt = header;
        e.prv = oldTail;
        oldTail.nxt = header.prv = e;
        modCount++;
    }

一直以来困惑我的问题在于Lrucache在get的时候,返回不为空的时候,是怎么实现的让当前节点移动到链表map的最前端,今天看源码的时候得到了解答。

然后Lrucache每次put操作时都会安全检查一下。当超出时,则:

  Map.Entry<K, V> toEvict = map.entrySet().iterator().next();
                key = toEvict.getKey();
                value = toEvict.getValue();
                map.remove(key);
                size -= safeSizeOf(key, value);

差不多了,这就是我对LruCache是怎么实现LRU算法,并且能保证内存不溢出的理解!!!


相关文章推荐

LruCache 源码分析

我在参加笔试的时候,有一道题是设计一个 LruCache,当时由于不理解原理而没有写出来,现在看了几遍源码,记录下笔记理清思路...
  • xyh269
  • xyh269
  • 2017年04月30日 16:54
  • 246

从HashMap到LruCache的源码分析

android的图片加载库Android-Universal-Image-Loader中的缓存策略,内存缓存LruCache,是一个最近最少使用算法LRU。前几天看操作系统也看到了LRU算法,是用在缺...

Lrucache源码分析

LruCache源码分析 1. Lrucache封装了LinkedHashMap,并将LinkedHashMap的accessOrder设为true。可以使遍历顺序和访问顺序一致,其内部双向链表将会...

Android LruCache 源码分析

学过操作系统这门课的朋友都还记得 LRU 这个算法吧,中文名叫”最近最久未使用”,它是用在页面置换策略中的一种很巧妙的淘汰算法,而在 Android 中,也有一个缓存淘汰机制用到了它,叫做 LruCa...

【Android 开发】深入理解内存缓存类LruCache:源码分析

ruCache是Android API实现的用于内存缓存的类,LRU即“Leatestrecent used”的缩写,典型应用是集中展示多个BitMap。这里讲解了其源码。...

LruCache.java这个类用来作为缓存图片是很不错的,源码的分析:

代码片段,双击复制 01 02 03 04 05 06 07 08 09 10 11 12 13 14 ...

Android 之 三级缓存(内存!!!、本地、网络)及内存LruCache扩展 及源码分析--- 学习和代码讲解

一. 三级缓存简介如上图所示,目前App中UI界面经常会涉及到图片,特别是像“今日关注”新闻这类app中,图片运用的几率十分频繁。当手机上需要显示大量图片类似listView、gridView控件并且...

LruCache源码分析

在讲解源码之前,首先我们要知道什么是Lru? LRU是Least Recently Used 近期最少使用算法。它的核心思想就是当缓存空间存满的时候,会优先淘汰那些近期最少使用的缓存对象。我们来看看...

Volley网络请求封装之LruCache源码分析

Volley网络请求封装之LruCache源码分析 相关知识点 常用的缓存禁止FIFO、LRU、LFU Volley与LruCache LinkedHashMap的特点 知识点讲解 之前也用...
  • Dnnis
  • Dnnis
  • 2016年06月18日 10:29
  • 909

levelDB源码分析-Cache(LRUCache、HashTable)

leveldb内部通过双向链表实现了一个LRUCache,利用双向链表实现LRUCache的算法在《操作系统》中描述的很清楚,这里和标准的LRUCache一样,这里不再描述。         LRU...
  • tankles
  • tankles
  • 2012年06月14日 16:31
  • 4442
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:LruCache源码分析及思考
举报原因:
原因补充:

(最多只允许输入30个字)