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为止。
第一步代码实现:
第二步代码实现:
第三步代码实现:
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为止。
第一步代码实现:
第二步代码实现:
第三步代码实现:
相关文章推荐
- 使用LinkedHashMap来实现一个使用LRU(Least Recently Used)算法的cache
- 基于LinkedHashMap实现LRU缓存调度算法原理
- 毕加索的艺术——Picasso,一个强大的Android图片下载缓存库,OkHttpUtils的使用,二次封装PicassoUtils实现微信精选
- 使用go语言的list实现一个简单的LRU缓存
- LRU算法的实现使用linkedHashMap方法,以及使用双链表+hashtable方法
- Java缓存的Lru算法实现---并对Android util类LruCache的改进
- Go/Python/Erlang编程语言对比分析及示例 基于RabbitMQ.Client组件实现RabbitMQ可复用的 ConnectionPool(连接池) 封装一个基于NLog+NLog.Mongo的日志记录工具类LogUtil 分享基于MemoryCache(内存缓存)的缓存工具类,C# B/S 、C/S项目均可以使用!
- 使用LRU算法缓存图片,android 3.0
- 使用LRU算法缓存图片,android 3.0
- 使用 LinkedHashMap 实现 LRU 算法
- 使用LinkedHashMap实现LRU缓存
- 利用LinkedHashMap实现LRU算法缓存
- 有一副由NxN矩阵表示的图像,这里每个像素用一个int表示,请编写一个算法,在不占用额外内存空间的情况下(即不使用缓存矩阵),将图像顺时针旋转90度。 给定一个NxN的矩阵,和矩阵的阶数N,请返回旋转
- Android照片墙应用实现使用硬件缓存跟内存缓存
- 使用 Java.util.LinkedHashMap 实现 LRU、FIFO 算法
- 毕加索的艺术——Picasso,一个强大的Android图片下载缓存库,OkHttpUtils的使用,二次封装PicassoUtils实现微信精选
- 转:LinkedHashMap使用(可以用来实现LRU缓存)
- 有一副由NxN矩阵表示的图像,这里每个像素用一个int表示,请编写一个算法,在不占用额外内存空间的情况下(即不使用缓存矩阵),将图像顺时针旋转90度。
- 基于LinkedHashMap实现LRU缓存调度算法原理
- 使用LRU算法缓存图片,android 3.0