java lrucache_Java LruCache 的使用及原理

article/2025/8/25 3:37:05

49eed51603e600f5f4e310365bcedf63.png

概述

LRU (Least Recently Used) 的意思就是近期最少使用算法,它的核心思想就是会优先淘汰那些近期最少使用的缓存对象。

在我们日常开发中,UI 界面进行网络图片加载是很正常的一件事情,但是当界面上的图片过于多的时候,不可能每次都从网络上进行图片的获取,一方面效率会很低,另一方面,也会非常耗费用户的流量。

Android 为我们提供了 LruCache 类,使用它我们可以进行图片的内存缓存,今天我们就一起学习一下吧。

使用 LruCache 进行图片加载

1. 编写 MyImageLoader 类,实现图片缓存功能。

8b518f54ac8a3bbdffb1167b49011700.png

ad5dfc172248fe36dd79d16595a5a2b3.png

至于代码的具体含义,注释已经进行了诠释。

2. 在 Activity 中进行图片的缓存及加载

a73201b78e956f745739dfa54d42f4ea.png

c07f5a5cc353bfdc4f65871660ce7a88.png

8ab6edc81fc08cd34c687db3f94bd77d.png

e5bf2de676c2503de7204d3cfae0c180.png

其中的布局文件就很简单,一个按钮 + 一个 Imageview

4333bf446f37fd884cd968ad0ae0ccdd.png

代码中还用到了一个工具类,主要用于将图片的 url 转换为 md5 编码后的字符串,用作缓存文件的 key 进行存储,保证其独一性

29a40073a1e6f619ea5275fca6b9859f.png

3. 实际使用

我们进行加载图片按钮的多次点击,通过 log 进行查看是否正常缓存

9db1be89d3ea0575f57a5290707823ce.png

可以看出,除了第一次图片是从网络上进行下载,之后都是从缓存中进行获取。

LruCache 原理解析

LruCache 的文档描述

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.

一个包含有限数量强引用的缓存,每次访问一个值,它都会被移动到队列的头部,将一个新的值添加到已经满了的缓存队列时,该队列末尾的值将会被逐出,并且可能会被垃圾回收机制进行回收。

LruCache 构造函数

创建了一个 LinkedHashMap,三个参数分别为 初始容量、加载因子和访问顺序,当 accessOrder 为 true 时,这个集合的元素顺序就会是访问顺序,也就是访问了之后就会将这个元素放到集合的最后面。

60b188538334d5abc1e61d4c97501c00.png

有些人可能会有疑问,初始容量传 0 的话,那岂不是没办法进行存储了,那么创建这个 LinkedHashMap 还有什么意义呢?

其实要解答这个问题并不难,看下源码你就会发现

其实第一个参数是你要设置的初始大小;而程序内部实际的初始大小是1;如果你设置的初始大小(initialCapacity)小于1, 那么map大小就是默认的1;否则会不断左移(乘2)直到capacity大于你设置的initialCapacity;

f42d85d5fbe0ba9a2a87b88539e823d8.png

LruCache 的 put 方法

其中的 trimToSize() 方法用于判断加入元素后是否超过最大缓存数,如果超过就清除掉最少使用的元素。

608292db25c788de8c2bb787c14bd10c.png

16a84d3d48d71706e6bddf85d13eba07.png

LruCache 的 get 方法

LruCahche 的 get() 方法源码

25a8f2badb98d70f0b765b82c19a59f1.png

LinkedHashMap 的 get() 方法源码

0c27460a386f750aee3c18079e9305df.png

afterNodeAccess() 方法源码

ab1c2615ce423e250ab8d5c34616d1ff.png

LruCache 的 remove 方法

从缓存中删除内容,并更新缓存大小

b3711cef6f73211ad15b940554adc97e.png

总结

当缓存满了之后,LruCache 是最近最少使用的元素会被移除内部使用了 LinkedHashMap 进行存储总缓存大小一般为可用内存的 1/8当使用 get() 访问元素后,会将该元素移动到 LinkedHashMap 的尾部


http://chatgpt.dhexx.cn/article/vRw4ixx3.shtml

相关文章

LruCache和DiskLruCache

前言 Android中的三级缓存主要就是内存缓存和硬盘缓存。 Lru(least recently used)意为最近最少使用算法,核心思想就是当缓存满时,会优先淘汰最近最少使用的缓存对象。 LruCache的使用 在Android中可以直接使用LruCache,算法原理是&#xff1…

Android LruCache 缓存

使用场景 1、场景一:图片缓存利器。 可以规定缓存大小、有效避免OOM、自动移除队尾不用的图片缓存、避免HashMap各种问题。 2、场景二:通信缓存 从服务端需要获取数据,但是当访问的数据比较大,比较多,并且是重复数…

Java——LRUCache

概念 简单来说,由于我们的空间是有限的,所以发明了这个数据结构,当我们的空间不够添加新的元素时,就会删除最近最少使用的元素。 其底层逻辑通过哈希表和链表共同实现。哈希表中存储链表的每一个元素,方便进行元素的…

LruCache缓存

Lru算法: Lru 指的是“Least Recently Used-近期最少使用算法”。 1、那么LruCache到底是什么呢? LruCache 是对限定数量的缓存对象持有强引用的缓存,每一次缓存对象被访问,都会被移动到队列的头部。当有对象要被添加到已经达到数…

LruCache 源码解析

1. 概述 对于 Android 开发者,LruCache 肯定不陌生,几乎所有的图片缓存框架都会用到它来实现内存缓存等,可见 LruCache 在 Android 开发中的重要性。LRU 是 Least Recently Used 的缩写,近期最少使用的意思。当我们进行缓存的时候…

LruCache

LruCache这个类是通过Glide得知的,不过它是自己又基于LRU算法自己写了个LruCache工具类,不过基本原理类似,都是基于LRU算法实现的 1.来源 一般来说,缓存策略主要包含缓存的添加、获取和删除这三类操作。如何添加和获取缓存这个比…

Android基础-LruCache原理解析

一、Android中的缓存策略 一般来说,缓存策略主要包含缓存的添加、获取和删除这三类操作。如何添加和获取缓存这个比较好理解,那么为什么还要删除缓存呢?这是因为不管是内存缓存还是硬盘缓存,它们的缓存大小都是有限的。当缓存满了…

LRUCache详解

1.概念 LRU是Least Recently Used的缩写,意思是最近最少使用,它是一种Cache替换算法。 Cache的容量有限,因此当Cache的容量用完后,而又有新的内容需要添加进来时, 就需要挑选并舍弃原有的部分内容,从而腾出…

LRUCache 详解

LRU算法详解 一、什么是 LRU 算法 就是一种缓存淘汰策略。 计算机的缓存容量有限,如果缓存满了就要删除一些内容,给新内容腾位置。但问题是,删除哪些内容呢?我们肯定希望删掉哪些没什么用的缓存,而把有用的数据继续…

LRU Cache

前言 哈喽,各位小伙伴大家好,本章内容为大家介绍计算机当中为了提高数据相互传输时的效率而引进的一种重要设计结构叫做LRU Cache,下面将为大家详细介绍什么是LRU Cache,以及它是如何是实现的,如何提升效率的。 1.什么是LRU Cache? LRU是L…

uniapp日历原生插件

<template><!-- 打卡日历页面 --><view classall><view class"bar"><!-- 上一个月 --><view class"previous" click"handleCalendar(0)"><button class"barbtn">上一月</button><…

微信小程序使用日历插件

一&#xff0c;添加插件 1&#xff0c;在你的小程序关联的微信公众平台打开 设置》第三方服务》添加插件 2&#xff0c;直接AppID&#xff08;wx92c68dae5a8bb046&#xff09;搜索到该插件并申请授权&#xff0c;授权成功即可在小程序使用 二&#xff0c;小程序使用插件 app…

日历组件

日历组件&#xff1a; <template><div class"calendar" click.stop><div class"input-wrap"><inputtype"text"v-if"dateChangeSets":placeholder"placeholder"class"input dateChangeSets middle…

vue-calendar基于vue的日历插件

本文转载于https://www.cnblogs.com/zwhgithub/p/8005414.html vue-calendar-component 基于 vue 2.0 开发的轻量&#xff0c;高性能日历组件占用内存小&#xff0c;性能好&#xff0c;样式好看&#xff0c;可扩展性强原生 js 开发&#xff0c;没引入第三方库 效果 Install …

实用插件(一)日历插件——My97DatePicker

注&#xff1a;My97DatePicker插件仅限pc端使用&#xff0c;若是app项目&#xff0c;建议使用ICalendar或者Mobiscroll。 &#xff08;ICalendar插件在华为手机上存在兼容性问题&#xff0c;日期不能滚动&#xff0c;但使用很简单&#xff1b;Mobiscroll使用起来较为复杂&…

sys-calendar.js带节假日的日历插件

下载地址 sys-calendar.js带节假日的日历插件&#xff0c;代码引用比较多。 dd:

jquery日历插件,可自定义日期内容

效果图&#xff1a; 使用&#xff1a; <link href"static/css/raoCalendar.css" rel"stylesheet" type"text/css"><script src"static/js/jquery.min.js"></script> <script src"static/js/raoCalendar.js…

两款超好用js日历插件(fullcalendar和zabuto_calendar)

这两款插件特别类似,其实用其中一款即可。 先展示一下我用这两款插件制作的排班系统 这个是fullcalendar插件制作的排班页面,左边新建一系列组和组员,可以将人员直接拖拽至右边的日历上,不同组以颜色区别。 这个是将上面的排班内容用zabuto_calendar插件显示出来,黄色区域…

BootStrap日历插件

BootStrap日历插件 前端引入插件三大步骤 引入插件所需的资源文件 <%--引入BootStrap日历插件相关资源文件--%><%--按照资源文件相互依赖的顺序来引入--%><script type"text/javascript" src"jquery/jquery-1.11.1-min.js"></scrip…

jQuery实现移动端手机选择日期日历插件

效果图 calendar.css html, body {color: #333;margin: 0;height: 100%;font-family: "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, Verdana, sans-serif;-webkit-font-smoothing: antialiased;-moz-osx-font-smoothing: grayscale;font-weig…