Android提供的LruCache类简介(1)

  1. If your cached values hold resources that need to be explicitly released,

  2. * override {@link #entryRemoved}.

  3. * 如果你cache的某个值需要明确释放,重写entryRemoved()

  4. If a cache miss should be computed on demand for the corresponding keys,

  5. * override {@link #create}. This simplifies the calling code, allowing it to

  6. * assume a value will always be returned, even when there’s a cache miss.

  7. * 如果key相对应的item丢掉啦,重写create().这简化了调用代码,即使丢失了也总会返回。

  8. By default, the cache size is measured in the number of entries. Override

  9. * {@link #sizeOf} to size the cache in different units. For example, this cache

  10. * is limited to 4MiB of bitmaps: 默认cache大小是测量的item的数量,重写sizeof计算不同item的

  11. *  大小。

  12.    {@code

  13. *   int cacheSize = 4 * 1024 * 1024; // 4MiB

  14. *   LruCache<String, Bitmap> bitmapCache = new LruCache<String, Bitmap>(cacheSize) {

  15. *       protected int sizeOf(String key, Bitmap value) {

  16. *           return value.getByteCount();

  17. *       }

  18. *   }}

  19. *

  20. This class is thread-safe. Perform multiple cache operations atomically by

  21. * synchronizing on the cache: 

       {@code

  22. *   synchronized (cache) {

  23. *     if (cache.get(key) == null) {

  24. *         cache.put(key, value);

  25. *     }

  26. *   }}

  27. *

  28. This class does not allow null to be used as a key or value. A return

  29. * value of null from {@link #get}, {@link #put} or {@link #remove} is

  30. * unambiguous: the key was not in the cache.

  31. * 不允许key或者value为null

  32. *  当get(),put(),remove()返回值为null时,key相应的项不在cache中

  33. */

  34. public class LruCache<K, V> {

  35. private final LinkedHashMap<K, V> map;

  36. /** Size of this cache in units. Not necessarily the number of elements. */

  37. private int size; //已经存储的大小

  38. private int maxSize; //规定的最大存储空间

  39. private int putCount;  //put的次数

  40. private int createCount;  //create的次数

  41. private int evictionCount;  //回收的次数

  42. private int hitCount;  //命中的次数

  43. private int missCount;  //丢失的次数

  44. /**

  45. * @param maxSize for caches that do not override {@link #sizeOf}, this is

  46. *     the maximum number of entries in the cache. For all other caches,

  47. *     this is the maximum sum of the sizes of the entries in this cache.

  48. */

  49. public LruCache(int maxSize) {

  50. if (maxSize <= 0) {

  51. throw new IllegalArgumentException(“maxSize <= 0”);

  52. }

  53. this.maxSize = maxSize;

  54. this.map = new LinkedHashMap<K, V>(0, 0.75f, true);

  55. }

  56. /**

  57. * Returns the value for {@code key} if it exists in the cache or can be

  58. * created by {@code #create}. If a value was returned, it is moved to the

  59. * head of the queue. This returns null if a value is not cached and cannot

  60. * be created. 通过key返回相应的item,或者创建返回相应的item。相应的item会移动到队列的头部,

  61. * 如果item的value没有被cache或者不能被创建,则返回null。

  62. */

  63. public final V get(K key) {

  64. if (key == null) {

  65. throw new NullPointerException(“key == null”);

  66. }

  67. V mapValue;

  68. synchronized (this) {

  69. mapValue = map.get(key);

  70. if (mapValue != null) {

  71. hitCount++;  //命中

  72. return mapValue;

  73. }

  74. missCount++;  //丢失

  75. }

  76. /*

  77. * Attempt to create a value. This may take a long time, and the map

  78. * may be different when create() returns. If a conflicting value was

  79. * added to the map while create() was working, we leave that value in

  80. * the map and release the created value.

  81. * 如果丢失了就试图创建一个item

  82. */

  83. V createdValue = create(key);

  84. if (createdValue == null) {

  85. return null;

  86. }

  87. synchronized (this) {

  88. createCount++;//创建++

  89. mapValue = map.put(key, createdValue);

  90. if (mapValue != null) {

  91. // There was a conflict so undo that last put

  92. //如果前面存在oldValue,那么撤销put()

  93. map.put(key, mapValue);

  94. } else {

  95. size += safeSizeOf(key, createdValue);

  96. }

  97. }

  98. if (mapValue != null) {

  99. entryRemoved(false, key, createdValue, mapValue);

  100. return mapValue;

  101. } else {

  102. trimToSize(maxSize);

  103. return createdValue;

  104. }

  105. }

  106. /**

  107. * Caches {@code value} for {@code key}. The value is moved to the head of

  108. * the queue.

  109. *

  110. * @return the previous value mapped by {@code key}.

  111. */

  112. public final V put(K key, V value) {

  113. if (key == null || value == null) {

  114. throw new NullPointerException(“key == null || value == null”);

  115. }

  116. V previous;

  117. synchronized (this) {

  118. putCount++;

  119. size += safeSizeOf(key, value);

  120. previous = map.put(key, value);

  121. if (previous != null) {  //返回的先前的value值

  122. size -= safeSizeOf(key, previous);

  123. }

  124. }

  125. if (previous != null) {

  126. entryRemoved(false, key, previous, value);

  127. }

  128. trimToSize(maxSize);

  129. return previous;

  130. }

  131. /**

  132. * @param maxSize the maximum size of the cache before returning. May be -1

  133. *     to evict even 0-sized elements.

  134. *  清空cache空间

  135. */

  136. private void trimToSize(int maxSize) {

  137. while (true) {

  138. K key;

  139. V value;

  140. synchronized (this) {

  141. if (size < 0 || (map.isEmpty() && size != 0)) {

  142. throw new IllegalStateException(getClass().getName()

  143. + “.sizeOf() is reporting inconsistent results!”);

  144. }

  145. if (size <= maxSize) {

  146. break;

  147. }

  148. Map.Entry<K, V> toEvict = map.eldest();

  149. if (toEvict == null) {

  150. break;

  151. }

  152. key = toEvict.getKey();

  153. value = toEvict.getValue();

  154. map.remove(key);

  155. size -= safeSizeOf(key, value);

  156. evictionCount++;

  157. }

  158. entryRemoved(true, key, value, null);

  159. }

  160. }

  161. /**

  162. * Removes the entry for {@code key} if it exists.

  163. * 删除key相应的cache项,返回相应的value

  164. * @return the previous value mapped by {@code key}.

  165. */

  166. public final V remove(K key) {

  167. if (key == null) {

  168. throw new NullPointerException(“key == null”);

  169. }

  170. V previous;

  171. synchronized (this) {

  172. previous = map.remove(key);

  173. if (previous != null) {

  174. size -= safeSizeOf(key, previous);

  175. }

  176. }

  177. if (previous != null) {

  178. entryRemoved(false, key, previous, null);

  179. }

  180. return previous;

  181. }

  182. /**

  183. * Called for entries that have been evicted or removed. This method is

  184. * invoked when a value is evicted to make space, removed by a call to

  185. * {@link #remove}, or replaced by a call to {@link #put}. The default

  186. * implementation does nothing.

  187. * 当item被回收或者删掉时调用。改方法当value被回收释放存储空间时被remove调用,

  188. * 或者替换item值时put调用,默认
    实现什么都没做。

  189. The method is called without synchronization: other threads may

  190. * access the cache while this method is executing.

  191. *

  192. * @param evicted true if the entry is being removed to make space, false

  193. *     if the removal was caused by a {@link #put} or {@link #remove}.

  194. * true—为释放空间被删除;false—put或remove导致

  195. * @param newValue the new value for {@code key}, if it exists. If non-null,

  196. *     this removal was caused by a {@link #put}. Otherwise it was caused by

  197. *     an eviction or a {@link #remove}.

  198. */

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

  200. /**

  201. * Called after a cache miss to compute a value for the corresponding key.

  202. * Returns the computed value or null if no value can be computed. The

  203. * default implementation returns null.

  204. * 当某Item丢失时会调用到,返回计算的相应的value或者null

  205. The method is called without synchronization: other threads may

  206. * access the cache while this method is executing.

  207. *

  208. If a value for {@code key} exists in the cache when this method

  209. * returns, the created value will be released with {@link #entryRemoved}

  210. * and discarded. This can occur when multiple threads request the same key

  211. * at the same time (causing multiple values to be created), or when one

  212. * thread calls {@link #put} while another is creating a value for the same

  213. * key.

  214. */

  215. protected V create(K key) {

  216. return null;

  217. }

  218. private int safeSizeOf(K key, V value) {

  219. int result = sizeOf(key, value);

  220. if (result < 0) {

  221. throw new IllegalStateException("Negative size: " + key + “=” + value);

  222. }

  223. return result;

  224. }

  225. /**

  226. * Returns the size of the entry for {@code key} and {@code value} in

  227. * user-defined units.  The default implementation returns 1 so that size

  228. * is the number of entries and max size is the maximum number of entries.

  229. * 返回用户定义的item的大小,默认返回1代表item的数量,最大size就是最大item值

  230. An entry’s size must not change while it is in the cache.

  231. */

  232. protected int sizeOf(K key, V value) {

  233. return 1;

  234. }

  235. /**

  236. * Clear the cache, calling {@link #entryRemoved} on each removed entry.

最后

小编这些年深知大多数初中级Android工程师,想要提升自己,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助

因此我收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人

都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

资料⬅专栏获取
0.      */

  1. protected int sizeOf(K key, V value) {

  2. return 1;

  3. }

  4. /**

  5. * Clear the cache, calling {@link #entryRemoved} on each removed entry.

最后

小编这些年深知大多数初中级Android工程师,想要提升自己,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助

因此我收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。

[外链图片转存中…(img-7R2o989d-1718991877996)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人

都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

资料⬅专栏获取

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/31895.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

redis.conf 参数详解,方便进行性能优化配置

以下是redis.conf中一些常见参数的详细说明&#xff1a; daemonize&#xff1a;是否以后台进程运行&#xff0c;默认为no&#xff1b; pidfile&#xff1a;如以后台进程运行&#xff0c;则需指定一个pid&#xff0c;默认为/var/run/redis.pid&#xff1b;bind&#xff1a;绑定主…

【鸿蒙】创建第⼀个鸿蒙项⽬

点击 Create Project 配置项目 开发工具界面 工程介绍

RFID无线测温技术在医院电力系统中的应用

在医疗设施的日常运营中&#xff0c;确保电力系统的可靠性和安全性至关重要。特别是在医院环境中&#xff0c;对于供电的稳定与安全有着十分高的要求&#xff0c;面对持续增加的就医人数所带来的接诊压力及高精密设备所带来的电力运行负荷&#xff0c;这是对医疗机构的电力系统…

vue实现post请求接口流式输出数据sse

使用fetchEventSource 参考git源码&#xff1a;https://github.com/Azure/fetch-event-source/tree/main 本地联通 发现数据并没有流式输出&#xff1a;vue代理需要关闭compress 如下&#xff1a; devServer:{proxy:{},compress:false } 安装插件 npm install microsoft/f…

远程医疗软件到底哪个好用?

随着科技进步的不断推进&#xff0c;远程医疗已经成为现代医疗体系的一个重要支柱。远程医疗软件&#xff0c;通过网络通信技术的运用&#xff0c;打破了地理限制&#xff0c;实现了医疗资源的有效整合与共享&#xff0c;为民众提供了前所未有的便捷高效的医疗服务体验。那么&a…

如何修改外接移动硬盘的区号

- 问题介绍 当电脑自身内存不够使用的时候&#xff0c;使用外接硬盘扩展内存是一个不错的选择。但是当使用的外接硬盘数量过多的时候&#xff0c;会出现分配硬盘的区号变动的情况&#xff0c;这种情况下会极大的影响使用的体验情况。可以通过以下步骤手动调整恢复 - 配置 版本…

python-16-零基础学python 用类实现登录次数的记录

学习内容&#xff1a;《python编程&#xff1a;从入门到实践》第二版 知识点&#xff1a; 类&#xff0c;特殊函数&#xff0c;编写方法&#xff0c;创建实例&#xff0c;用方法修改类的值 练习内容&#xff1a; 练习9-5&#xff1a;尝试登录次数 在为完成练习9-3而编写的…

功能测试【测试用例模板、Bug模板、手机App测试】

功能测试 Day01 web项目环境与测试流程、业务流程测试一、【了解】web项目环境说明1.1 环境的定义&#xff1a;项目运行所需要的所有的软件和硬件组合1.2 环境(服务器)的组成&#xff1a;操作系统数据库web应用程序项目代码1.3 面试题&#xff1a;你们公司有几套环境&#xff1…

09-axios在Vue中的导入与配置

09-axios 前言首先简单了解什么是Axios&#xff1f;以上完成后就可以使用了 前言 我们接着上一篇文章 08-路由地址的数据获取 来讲。 下一篇文章 10-vuex在Vue中的导入与配置 首先简单了解什么是Axios&#xff1f; Axios是一个基于Promise 用于浏览器和 nodejs 的 HTTP 客户端…

百度文心智能体,创建属于自己的智能体应用

百度文心智能体平台为你开启。百度文心智能体平台&#xff0c;创建属于自己的智能体应用。百度文心智能体平台是百度旗下的智能AI平台&#xff0c;集成了先进的自然语言处理技术和人工智能技术&#xff0c;可以用来创建属于自己的智能体应用&#xff0c;访问官网链接&#xff1…

docker基础使用教程

1.准备工作 例子&#xff1a;工程在docker_test 生成requirements.txt文件命令&#xff1a;&#xff08;使用参考链接2&#xff09; pip list --formatfreeze > requirements.txt 参考链接1&#xff1a; 安装pipreqs可能比较困难 python 项目自动生成环境配置文件require…

通俗解释resultType和resultMap的区别

【 1 对于单表而言&#xff1a; 注&#xff1a;以下都是摘抄过来的&#xff0c;做了让自己更能理解的版本 如果数据库返回结果的列名和要封装的实体的属性名完全一致的话用 resultType 属性 如果数据库返回结果的列名&#xff08;起了别名&#xff09;和要封装的实体的属性名…

ArcGIS批量投影转换的妙用(地理坐标系转换为平面坐标系)

​ 点击下方全系列课程学习 点击学习—>ArcGIS全系列实战视频教程——9个单一课程组合系列直播回放 这次文章我们来介绍一下&#xff0c;如何巧妙用要素数据集来实现要素的批量投影。不需要ArcGIS的模型构建器与解决。 例如&#xff0c;有多个要素要将CGCS_2000地理坐标系投…

D触发器(D Flip-Flop)与D锁存器(D Latch)

1 基础概念 我们先来简单回顾一下D触发器&#xff08;D flip-flop&#xff09;和D锁存器&#xff08;D latch&#xff09;的概念&#xff0c;以及它们在数字电路中的作用。 1.1 D触发器&#xff08;D Flip-Flop&#xff09; D触发器是一种数字存储器件&#xff0c;它在时钟信号…

【VS Code 插件】SQLite 可视化插件

VScode 插件分享篇之sqlite可视化工具 项目经常用到SQLite这个轻量型数据库&#xff0c;于是乎&#xff0c;就想着找一个可视化工具&#xff0c;但是我有时候只是想方便预览数据 表&#xff0c;又不想安装额外的程序&#xff0c;那么这款插件很适合你。 用习惯VS Code的小伙伴…

HarmonyOS Next 系列之沉浸式状态实现的多种方式(七)

系列文章目录 HarmonyOS Next 系列之省市区弹窗选择器实现&#xff08;一&#xff09; HarmonyOS Next 系列之验证码输入组件实现&#xff08;二&#xff09; HarmonyOS Next 系列之底部标签栏TabBar实现&#xff08;三&#xff09; HarmonyOS Next 系列之HTTP请求封装和Token…

Win11 删除文件时提示“找不到该项目,请重试”的解决办法

1、Win R 打开运行窗口&#xff0c;输入 notepad 并回车打开文本文档(记事本)软件&#xff0c;如下图&#xff1a; 2、在文本文档(记事本)软件中复制粘贴以下代码&#xff0c;如下图&#xff1a; del /f /a /q \\?\%1 rd /s /q \\?\%1或DEL /F /A /Q \\?\%1 RD /S /Q \\?…

html做一个分组散点图图的软件

在HTML中创建一个分组散点图&#xff0c;可以结合JavaScript库如D3.js或Plotly.js来实现。这些库提供了强大的数据可视化功能&#xff0c;易于集成和使用。下面是一个使用Plotly.js创建分组散点图的示例&#xff1a; 要添加文件上传功能&#xff0c;可以让用户上传包含数据的文…

昇思25天学习打卡营第4天|网络构建|函数式自动微分

学AI还能赢奖品&#xff1f;每天30分钟&#xff0c;25天打通AI任督二脉 (qq.com) 网络构建 神经网络模型是由神经网络层和Tensor操作构成的&#xff0c;mindspore.nn提供了常见神经网络层的实现&#xff0c;在MindSpore中&#xff0c;Cell类是构建所有网络的基类&#xff0c;也…

基于uni-app和图鸟UI的智慧农业综合管控平台小程序技术实践

摘要&#xff1a; 随着信息化技术的飞速发展&#xff0c;智慧农业已成为推动农业现代化、提升农业生产效率的重要手段。本文介绍了一款基于uni-app框架和图鸟UI设计的智慧农业综合管控平台小程序&#xff0c;该平台整合了传感器控制、农业数据监测、设施管控、农业新闻传播以及…