Android提供的LruCache类简介(1)
-
*
If your cached values hold resources that need to be explicitly released,
-
* override {@link #entryRemoved}.
-
* 如果你cache的某个值需要明确释放,重写entryRemoved()
-
*
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.
-
* 如果key相对应的item丢掉啦,重写create().这简化了调用代码,即使丢失了也总会返回。
-
*
By default, the cache size is measured in the number of entries. Override
-
* {@link #sizeOf} to size the cache in different units. For example, this cache
-
* is limited to 4MiB of bitmaps: 默认cache大小是测量的item的数量,重写sizeof计算不同item的
-
* 大小。
-
*
{@code
-
* int cacheSize = 4 * 1024 * 1024; // 4MiB
-
* LruCache<String, Bitmap> bitmapCache = new LruCache<String, Bitmap>(cacheSize) {
-
* protected int sizeOf(String key, Bitmap value) {
-
* return value.getByteCount();
-
* }
-
* }}
-
*
-
*
This class is thread-safe. Perform multiple cache operations atomically by
-
* synchronizing on the cache:
{@code
-
* synchronized (cache) {
-
* if (cache.get(key) == null) {
-
* cache.put(key, value);
-
* }
-
* }}
-
*
-
*
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时,key相应的项不在cache中
-
*/
-
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; //put的次数
-
private int createCount; //create的次数
-
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);
-
}
-
/**
-
* Returns the value for {@code key} if it exists in the cache or can be
-
* created by {@code #create}. If a value was returned, it is moved to the
-
* head of the queue. This returns null if a value is not cached and cannot
-
* be created. 通过key返回相应的item,或者创建返回相应的item。相应的item会移动到队列的头部,
-
* 如果item的value没有被cache或者不能被创建,则返回null。
-
*/
-
public final V get(K key) {
-
if (key == null) {
-
throw new NullPointerException(“key == null”);
-
}
-
V mapValue;
-
synchronized (this) {
-
mapValue = map.get(key);
-
if (mapValue != null) {
-
hitCount++; //命中
-
return mapValue;
-
}
-
missCount++; //丢失
-
}
-
/*
-
* Attempt to create a value. This may take a long time, and the map
-
* may be different when create() returns. If a conflicting value was
-
* added to the map while create() was working, we leave that value in
-
* the map and release the created value.
-
* 如果丢失了就试图创建一个item
-
*/
-
V createdValue = create(key);
-
if (createdValue == null) {
-
return null;
-
}
-
synchronized (this) {
-
createCount++;//创建++
-
mapValue = map.put(key, createdValue);
-
if (mapValue != null) {
-
// There was a conflict so undo that last put
-
//如果前面存在oldValue,那么撤销put()
-
map.put(key, mapValue);
-
} else {
-
size += safeSizeOf(key, createdValue);
-
}
-
}
-
if (mapValue != null) {
-
entryRemoved(false, key, createdValue, mapValue);
-
return mapValue;
-
} else {
-
trimToSize(maxSize);
-
return createdValue;
-
}
-
}
-
/**
-
* Caches {@code value} for {@code key}. The value is moved to the head of
-
* the queue.
-
*
-
* @return the previous value mapped by {@code key}.
-
*/
-
public final V put(K key, V value) {
-
if (key == null || value == null) {
-
throw new NullPointerException(“key == null || value == null”);
-
}
-
V previous;
-
synchronized (this) {
-
putCount++;
-
size += safeSizeOf(key, value);
-
previous = map.put(key, value);
-
if (previous != null) { //返回的先前的value值
-
size -= safeSizeOf(key, previous);
-
}
-
}
-
if (previous != null) {
-
entryRemoved(false, key, previous, value);
-
}
-
trimToSize(maxSize);
-
return previous;
-
}
-
/**
-
* @param maxSize the maximum size of the cache before returning. May be -1
-
* to evict even 0-sized elements.
-
* 清空cache空间
-
*/
-
private void trimToSize(int maxSize) {
-
while (true) {
-
K key;
-
V value;
-
synchronized (this) {
-
if (size < 0 || (map.isEmpty() && size != 0)) {
-
throw new IllegalStateException(getClass().getName()
-
+ “.sizeOf() is reporting inconsistent results!”);
-
}
-
if (size <= maxSize) {
-
break;
-
}
-
Map.Entry<K, V> toEvict = map.eldest();
-
if (toEvict == null) {
-
break;
-
}
-
key = toEvict.getKey();
-
value = toEvict.getValue();
-
map.remove(key);
-
size -= safeSizeOf(key, value);
-
evictionCount++;
-
}
-
entryRemoved(true, key, value, null);
-
}
-
}
-
/**
-
* Removes the entry for {@code key} if it exists.
-
* 删除key相应的cache项,返回相应的value
-
* @return the previous value mapped by {@code key}.
-
*/
-
public final V remove(K key) {
-
if (key == null) {
-
throw new NullPointerException(“key == null”);
-
}
-
V previous;
-
synchronized (this) {
-
previous = map.remove(key);
-
if (previous != null) {
-
size -= safeSizeOf(key, previous);
-
}
-
}
-
if (previous != null) {
-
entryRemoved(false, key, previous, null);
-
}
-
return previous;
-
}
-
/**
-
* Called for entries that have been evicted or removed. This method is
-
* invoked when a value is evicted to make space, removed by a call to
-
* {@link #remove}, or replaced by a call to {@link #put}. The default
-
* implementation does nothing.
-
* 当item被回收或者删掉时调用。改方法当value被回收释放存储空间时被remove调用,
-
* 或者替换item值时put调用,默认
实现什么都没做。 -
*
The method is called without synchronization: other threads may
-
* access the cache while this method is executing.
-
*
-
* @param evicted true if the entry is being removed to make space, false
-
* if the removal was caused by a {@link #put} or {@link #remove}.
-
* true—为释放空间被删除;false—put或remove导致
-
* @param newValue the new value for {@code key}, if it exists. If non-null,
-
* this removal was caused by a {@link #put}. Otherwise it was caused by
-
* an eviction or a {@link #remove}.
-
*/
-
protected void entryRemoved(boolean evicted, K key, V oldValue, V newValue) {}
-
/**
-
* Called after a cache miss to compute a value for the corresponding key.
-
* Returns the computed value or null if no value can be computed. The
-
* default implementation returns null.
-
* 当某Item丢失时会调用到,返回计算的相应的value或者null
-
*
The method is called without synchronization: other threads may
-
* access the cache while this method is executing.
-
*
-
*
If a value for {@code key} exists in the cache when this method
-
* returns, the created value will be released with {@link #entryRemoved}
-
* and discarded. This can occur when multiple threads request the same key
-
* at the same time (causing multiple values to be created), or when one
-
* thread calls {@link #put} while another is creating a value for the same
-
* key.
-
*/
-
protected V create(K key) {
-
return null;
-
}
-
private int safeSizeOf(K key, V value) {
-
int result = sizeOf(key, value);
-
if (result < 0) {
-
throw new IllegalStateException("Negative size: " + key + “=” + value);
-
}
-
return result;
-
}
-
/**
-
* Returns the size of the entry for {@code key} and {@code value} in
-
* user-defined units. The default implementation returns 1 so that size
-
* is the number of entries and max size is the maximum number of entries.
-
* 返回用户定义的item的大小,默认返回1代表item的数量,最大size就是最大item值
-
*
An entry’s size must not change while it is in the cache.
-
*/
-
protected int sizeOf(K key, V value) {
-
return 1;
-
}
-
/**
-
* Clear the cache, calling {@link #entryRemoved} on each removed entry.
最后
小编这些年深知大多数初中级Android工程师,想要提升自己,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。
因此我收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人
都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
资料⬅专栏获取
0. */
-
protected int sizeOf(K key, V value) {
-
return 1;
-
}
-
/**
-
* Clear the cache, calling {@link #entryRemoved} on each removed entry.
最后
小编这些年深知大多数初中级Android工程师,想要提升自己,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。
因此我收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
[外链图片转存中…(img-7R2o989d-1718991877996)]
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人
都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
资料⬅专栏获取
相关文章:

Android提供的LruCache类简介(1)
* If your cached values hold resources that need to be explicitly released, * override {link #entryRemoved}. * 如果你cache的某个值需要明确释放,重写entryRemoved() * If a cache miss should be computed on demand for the corresponding keys, * ov…...

【分布式系列】分布式锁timeout了怎么办?
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...
System.getProperty()方法总结
System.getProperty()方法总结 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!System.getProperty()方法是Java中用于获取系统属性的方法之一。它允许我们访问J…...

大型语言模型在AMD GPU上的推理优化
Large language model inference optimizations on AMD GPUs — ROCm Blogs 大型语言模型(LLMs)已经改变了自然语言处理和理解,促进了在多个领域中的众多人工智能应用。LLMs在包括AI助手、聊天机器人、编程、游戏、学习、搜索和推荐系统在内的…...

Apple - Core Foundation Design Concepts
本文翻译整理自:Core Foundation Design Concepts(更新日期:2013-12-16 https://developer.apple.com/library/archive/documentation/CoreFoundation/Conceptual/CFDesignConcepts/CFDesignConcepts.html#//apple_ref/doc/uid/10000122i 文章…...
lua中的lfs库介绍
lua中的lfs库介绍 说明常用函数解析lfs.attributeslfs.chdirlfs.currentdirlfs.dirlfs.mkdirlfs.rmdirlfs.locklfs.touchlfs.linklfs.setmodelfs.symlinkattributes 说明 lfs是lua中的一个文件系统库,提供了更多高级的文件和目录操作功能,使得lua可以更方…...
PyCharm 快捷键积累
1、快速格式化:Ctrl Alt L Ctrl Alt L 快捷键在 PyCharm 中是用于格式化代码的,它不仅仅适用于 HTML 代码,而是适用于多种编程和标记语言。...

C++进阶之AVL树
个人主页:点我进入主页 专栏分类:C语言初阶 C语言进阶 数据结构初阶 Linux C初阶 C进阶 算法 欢迎大家点赞,评论,收藏。 一起努力,一起奔赴大厂 目录 一.前言 二.插入 三.旋转 3.1右旋 …...
sizeof 和 strlen 比较
sizeof 和 strlen 在 C 语言中都是用于获取某种“大小”的,但它们之间有着显著的区别。 sizeof sizeof 是一个运算符,用于计算数据类型或对象在内存中的大小(以字节为单位)。它可以在编译时确定结果,因为它计算的是类…...

音视频开发—FFmpeg 打开摄像头进行RTMP推流
实验平台:Ubuntu20.04 摄像头:普通USB摄像头,输出格式为YUV422 1.配置RTMP服务器推流平台 使用Nginx 配置1935端口即可,贴上教程地址 ubuntu20.04搭建Nginxrtmp服务器) 2.配置FFmpeg开发环境 过程较为简单,这里不…...

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

JDK19特性
JDK19特性 一、JAVA19概述 JDK 19 2022 年 9 月 20 日正式发布以供生产使用,非长期支持版本。不过,JDK 19 中有一些比较重要的新特性值得关注。 JDK 19 只有 7 个新特性: JEP 405: Record Patterns(记录模式)[1] (预览)JEP 422: Linux/RISC-V Port[2]JEP 424: Foreign …...
sql语句中常用的函数有那些
1、字符串函数 CONCAT(string1, string2, ...): 连接两个或多个字符串。 UPPER(string): 将字符串转换为大写。 LOWER(string): 将字符串转换为小写。 TRIM(string): 去除字符串两端的空格。 LENGTH(string): 返回字符串的长度。 SUBSTRING(string, start, length): 从字符串中…...
odoo17 小变更3 Warning、 “attrs “和 “states “不再用
odoo17 小变更 1、Warning from odoo.exceptions import ValidationError,Warning ImportError: cannot import name Warning from odoo.exceptions (D:\od172406\odoo\exceptions.py) 2、自 17.0 版起,不再使用 "attrs "和 "states "属性。 …...

Unity3d 游戏暂停(timeScale=0)引起的deltaTime关联的系列问题解决
问题描述 游戏暂停的功能是通过设置timeScale0实现的,不过在暂停游戏的时候,需要对角色进行预览和设置,为了实现这个功能,是通过鼠标控制相机的操作,为了使相机的操作丝滑,获取鼠标操作系数乘以Time.delta…...

服务端代码编写中MySql大小写在Java中报错问题解决
报错信息: 原因:MySql和Java变量大小写产生的冲突。 经过查阅各个博客等,得出浅显结论(不一定对):MySql大小写不敏感,Java大小写敏感,当Javabean转为MySql数据库表时,Ja…...

CRMEB 多店商品详情页装修说明
一、功能介绍 商家可调整商品详情各板块样式,可根据不同的需求开启或关闭单独的板块 二、操作流程 装修 > 商品详情 三、功能说明 1、商品信息 可控制商品详情页面商品信息的显示与隐藏 2、会员信息,排行榜 控制商品详情页面会员信息及排行榜的…...

Redis-使用 jedis 操作数据
文章目录 1、Jedis简介2、环境准备3、创建maven普通项目,导入如下依赖4、测试JAVA程序和Redis之间的通信 1、Jedis简介 "Jedis" 通常是作为 "Java Redis" 的缩写或简称来理解的。Java Embedded Data Structures Interface 表示 Java嵌入式数据结构接口 2、…...
简说PIP换源
概述 PIP(Python Package Installer)是 Python 的包管理工具,用于安装和管理 Python 包。默认情况下,PIP 从 Python 官方的包仓库(即 PyPI)下载和安装包。然而,由于网络原因,访问官…...

django学习入门系列之第三点《CSS基础样式介绍2》
文章目录 文字对齐方式外边距内边距往期回顾 文字对齐方式 水平对齐方式 text-align: center;垂直对齐方式 /* 注意,这个只能是一行来居中 */ line-height:/*长度*/ ;样例 <!DOCTYPE html> <html lang"en"> <head><meta charset…...

微信小程序之bind和catch
这两个呢,都是绑定事件用的,具体使用有些小区别。 官方文档: 事件冒泡处理不同 bind:绑定的事件会向上冒泡,即触发当前组件的事件后,还会继续触发父组件的相同事件。例如,有一个子视图绑定了b…...

python打卡day49
知识点回顾: 通道注意力模块复习空间注意力模块CBAM的定义 作业:尝试对今天的模型检查参数数目,并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...

vscode(仍待补充)
写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh? debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...
2024年赣州旅游投资集团社会招聘笔试真
2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...
什么是EULA和DPA
文章目录 EULA(End User License Agreement)DPA(Data Protection Agreement)一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA(End User License Agreement) 定义: EULA即…...

12.找到字符串中所有字母异位词
🧠 题目解析 题目描述: 给定两个字符串 s 和 p,找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义: 若两个字符串包含的字符种类和出现次数完全相同,顺序无所谓,则互为…...

优选算法第十二讲:队列 + 宽搜 优先级队列
优选算法第十二讲:队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...
React---day11
14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store: 我们在使用异步的时候理应是要使用中间件的,但是configureStore 已经自动集成了 redux-thunk,注意action里面要返回函数 import { configureS…...
C++.OpenGL (20/64)混合(Blending)
混合(Blending) 透明效果核心原理 #mermaid-svg-SWG0UzVfJms7Sm3e {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-icon{fill:#552222;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-text{fill…...
C++课设:简易日历程序(支持传统节假日 + 二十四节气 + 个人纪念日管理)
名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《编程项目实战》 目录 一、为什么要开发一个日历程序?1. 深入理解时间算法2. 练习面向对象设计3. 学习数据结构应用二、核心算法深度解析…...