您的位置:首页 > 移动开发 > Android开发

Android使用LinkedHashMap实现一个LRU算法的内存缓存

2016-12-11 14:27 531 查看
LinkedHashMap的一些特点:

LinkedHashMap是一个先进先出的队列,里面的每一个元素都是Entry。

它的key和value都可以为null。

在插入一个新元素时,LinkedHashMap会判断你这个元素的key是否已经存在,如果存在,就用原来的key和你新插入的value关联,原来的value不用了,这样的话,LinkedHashMap还是保持原来的大小。比如你原来的LinkedHashMap中已经有了<9,”subuju”>这样的一个键值对,现在你要插入一个<9,”CSDN”>的键值对,那么现在的LinkedHashMap中将只存在<9,”CSDN”>的键值对。

LinkedHashMap有两种访问顺序,在初始化LinkedHashMap时,可以设置它的accessOrder,如果accessOrder为true,LinkedHashMap将把每次被访问的元素移至队尾,利用它实现LRU算法就是利用了这个特点,如果accessOrder为false时,将按照插入元素的顺序排列。

LRU算法是最近最少使用的算法,下面的例子以图片的名字作为key,以Bitmap为value。

实现思路,分以下三步:

开辟一块缓存Bitmap的总内存空间cacheSize,设置一个变量currentSize(初始值为0)用于表示当前已使用的cacheSize的大小。

缓存一张新图片时,先获得图片的大小,然后加上currentSize。

用currentSize和cacheSize比较,如果currentSize > cacheSize,则表示我们已经缓存的所有图片包括我们正在缓存的这张图片所占用的内存已经超出了我们设定的最大值cacheSize,获得LinkedHashMap的队头元素,并把它移除,调整currentSize,继续和cacheSize比较,如果还是大于,则继续移除队头元素,直到currentSize <= cacheSize为止。

第一步代码实现:



第二步代码实现:



第三步代码实现:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐