码迷,mamicode.com
首页 > 移动开发 > 详细

Android LruCache究竟是什么

时间:2015-11-14 00:58:32      阅读:454      评论:0      收藏:0      [点我收藏+]

标签:

源码: /frameworks/base/core/java/android/util/LruCache.java

 

文件开篇注释如下: 

A cache that holds strong references to a limited number of values. Each time a value is accessed, it is moved to the head of a queue. When a value is added to a full cache, the value at the end of that queue is evicted and may become eligible for garbage collection.

含义是:

    一个只对有限个value保持强引用的Cache.

    每次访问一个value, 它都会被移到队头.

    当一个Cache满了之后, 如果再向它添加元素, 队尾的元素将会被回收.

 

<p>If your cached values hold resources that need to be explicitly released, override {@link #entryRemoved}.

    如果有一个元素需要被显式的释放, 重写entryRemoved方法

    protected void entryRemoved(boolean evicted, K key, V oldValue, V newValue) {}


<p>If a cache miss should be computed on demand for the corresponding keys,override {@link #create}. 
This simplifies the calling code, allowing it to assume a value will always be returned, even when there‘s a cache miss.

 

    对这段理解的一直不是很好, 读完源码以后再说

    protected V create(K key) {
        return null;
    }

 

 

 

<p>This class does not allow null to be used as a key or value. 
A return value of null from {@link #get}, {@link #put} or {@link #remove} is unambiguous: the key was not in the cache.

 

    这个类不允许Key 和 Value 是 null. 如果 get, put, remove中出现了null, 那么将会返回 该Cache中不存在这个key 

 

关键代码:

public class LruCache<K, V> {
    private final LinkedHashMap<K, V> map;

    /** Size of this cache in units. Not necessarily the number of elements. */
    private int size;
    private int maxSize;

    private int putCount;
    private int createCount;
    private int evictionCount;
    private int hitCount;
    private int missCount;

    /**
     * @param maxSize for caches that do not override {@link #sizeOf}, this is
     *     the maximum number of entries in the cache. For all other caches,
     *     this is the maximum sum of the sizes of the entries in this cache.
     */
    public LruCache(int maxSize) {
        if (maxSize <= 0) {
            throw new IllegalArgumentException("maxSize <= 0");
        }
        this.maxSize = maxSize;
        this.map = new LinkedHashMap<K, V>(0, 0.75f, true);
    }
}

 

   使用 LinkedHashMap来管理整个Cache

 

Android LruCache究竟是什么

标签:

原文地址:http://www.cnblogs.com/carlo/p/4963618.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!