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源码解析

前言最近项目要用到Picasso,所以就看了一下Picasso里面的源码,发现里面的内存缓存主要用的LruCache这个类,就去看了一下它的相关的东西,还是挺有收获的。正文我一般看类源码喜欢以构造方法...
  • luoyanglizi
  • luoyanglizi
  • 2016年03月27日 22:27
  • 5033

Android源码解析——LruCache

我认为在写涉及到数据结构或算法的实现类的源码解析博客时,不应该急于讲它的使用或马上展开对源码的解析,而是要先交待一下这个数据结构或算法的资料,了解它的设计,再从它的设计出发去讲如何实现,最后从实现的角...
  • maosidiaoxian
  • maosidiaoxian
  • 2016年05月13日 11:17
  • 9102

LRUCache原理及HashMap LinkedHashMap内部实现原理

LRUCache HashMap LinkedHashMap内部实现原理
  • hlglinglong
  • hlglinglong
  • 2015年11月27日 17:11
  • 2143

LruCache 源码分析

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

LruCache源码分析

转载自:http://blog.csdn.net/chdjj/article/details/38701509?utm_source=tuicool&utm_medium=referral ...
  • crazy_yyyyy
  • crazy_yyyyy
  • 2016年07月23日 15:44
  • 966

2011年终工作总结与思考

2011年已到尾声,在这最后的几天里,我需要的是认真思考、总结一下今年的工作。     今年的事情比较专一,我一直在开发,其实很喜欢这种从头到尾做一件事情的感觉,比起东跑西颠,至少能在某一方面,有一...
  • BeyondHaven
  • BeyondHaven
  • 2011年12月20日 17:18
  • 5911

LRUCache的实现原理

简介LRU(Least Recently Used)最近最少使用,最近有时间和空间最近的歧义,所以我更喜欢叫它近期最少使用算法。它的核心思想是,如果一个数据被访问过,我们有理由相信它在将来被访问的概率...
  • windcake
  • windcake
  • 2017年02月06日 14:57
  • 655

Lrucache源码分析

LruCache源码分析 1. Lrucache封装了LinkedHashMap,并将LinkedHashMap的accessOrder设为true。可以使遍历顺序和访问顺序一致,其内部双向链表将会...
  • wangmengdeboke
  • wangmengdeboke
  • 2016年08月03日 16:49
  • 277

使用LruCache缓存,轻松解决图片过多造成的OOM

Android中一般情况下采取的缓存策略是使用二级缓存,即内存缓存+硬盘缓存—>LruCache+DiskLruCache,二级缓存可以满足大部分的需求了,另外还有个三级缓存(内存缓存+硬盘缓存+网络...
  • Mr_wzc
  • Mr_wzc
  • 2016年05月25日 12:18
  • 1798

浅析LruCache原理

Android用LruCache来取代原来强引用和软引用实现内存缓存,因为据说自2.3以后Android将更频繁的调用GC,导致软引用缓存的数据极易被释放。   LruCache使用一个Linke...
  • flypu
  • flypu
  • 2014年08月31日 00:00
  • 3856
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:LruCache源码分析及思考
举报原因:
原因补充:

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