Jetpack-Lifecycle组件-SafeIterableMap解析

Android MVVM实战:LiveData与Data Binding原理与避坑指南 LiveData是Android Jetpack中专为UI生命周期设计的状态观察者,其核心价值在于自动绑定LifecycleOwner并精准解绑,避免内存泄漏;Data Binding则通过编译期生成ViewDataBinding类,将XML声明式逻辑与Java/Kotlin代码解耦,显著提升UI渲染性能与可维护性。二者协同构成轻量、稳定、易调试的MVVM落地方案,特别适用于电商、金融等对稳定性与迭代效率要求严苛的商用App开发。本文聚焦真实项目中的状态管理、双向绑定、生命周期感知及高频编译/运行时问题,提 阅读详情

Jetpack-Lifecycle组件-SafeIterableMap解析

概述

在查看Lifecycle组件时,看到有SafeIterableMap的身影,于是就简单分析了一下这个类。

SafeIterableMap是一个数据结构实现类,它具备以下特点:

  • 支持键值存储,API类似于Map 采用链表实现
  • 支持遍历时删除任意数据,而不会抛出 ConcurrentModifiedException
  • 线程不安全

SafeIterableMap核心方法

方法 作用
putIfAbsent() 添加数据
如果指定Key还没有跟Value关联起来,就关联起来 添加到链表中
get() 根据Key获取指定链表节点数据
remove() 移除指定数据
size() 返回数据大小
iterator() 返回迭代器 默认使用升序查找方式
descendingIterator() 返回使用降序查找方式的迭代器
iteratorWithAdditions() 返回一个已添加的迭代器 供外部直接使用
eldest() 返回链表的头部数据
newest() 返回链表的尾部数据
FastSafeIterableMap

FastSafeIterableMap 继承 SafeIterableMap 并增加了如下方法

方法 作用
contains() 判断是否含有当前值
ceil() 返回给定Key的前驱指针数据

使用

SafeIterableMap 、 FastSafeIterableMap使用比较简单,测试用例代码如下:

SafeIterableMap

//SafeIterableMap 单元测试
@Test
fun safeIterableMapTest() {
   
   
    
    val safeMap = SafeIterableMap<String, String>()
    val keys = arrayOf("A", "B", "C", "D")
    
    //①添加数据
    for (s in keys) {
   
   
        safeMap.putIfAbsent(s, "value_".plus(s))
    }
    println("safeMap = $safeMap") //safeMap = [A=value_A, B=value_B, C=value_C, D=value_D]
    
    //②移除
    safeMap.remove("A")
    println("after remove : safeMap = $safeMap") //after remove : safeMap = [B=value_B, C=value_C, D=value_D]
    
    //③快速访问 头部数据、尾部数据
    println("safeMap.eldest() = ${
     
     safeMap.eldest()}") //safeMap.eldest() = B=value_B
    println("safeMap.newest() = ${
     
     safeMap.newest()}") //safeMap.newest() = D=value_D
    
    //④foreach 遍历
    println("begin forEach")
    safeMap.forEach {
   
   
        println(it)
    }
    println("complete forEach")
    //begin forEach
    //B=value_B
    //C=value_C
    //D=value_D
    //complete forEach
    
    
    //⑤移除指定数据
    safeMap.forEach {
   
   
        if (it.key == "C"){
   
   
            safeMap.remove(it.key)
        }
    }
    println("after foreach remove : safeMap = $safeMap") //after foreach remove : safeMap = [B=value_B, D=value_D]
}

上述测试代码演示了如何使用,注释部分为输出结果,故不再赘述。

FastSafeIterableMap

//FastSafeIterableMap 单元测试
@Test
fun fastSafeIterableMapTest(){
   
   

    val safeMap = FastSafeIterableMap<String, String>()
    val keys = arrayOf("A", "B", "C", "D")
    
    //①添加数据
    for (s in keys) {
   
   
        safeMap.putIfAbsent(s, "value_".plus(s))
    }
    println("safeMap = $safeMap") //safeMap = [A=value_A, B=value_B, C=value_C, D=value_D]
    
    //②判断是否含有某项值
    println("contains(B) = ${safeMap.contains("B")}") //contains(B) = true
    println("contains(X) = ${safeMap.contains("X")}") //contains(X) = false
    
    //③获取此项数据的前驱指针
    val c = safeMap.ceil("C")
    println("c = $c")<
SafeIterableMap SafeIterableMap 他是google工程师在 Androidx 中提供的一个简单数据结构,非线程安全,以键值对方式存取数据,看似一个map,其底层是一个双向链表,每一个键值对被包装成一个 Entry 被保存。支持双向遍历,并且支持在迭代过程中直接对集合的修改(直接调用map的put 或者remove方法,比如添加删除,不能调用Iteratorr的remove方法)。 阅读详情

相关推荐

HFSS学习笔记——Vivaldi天线仿真(一)

Vivaldi 天线HFSS仿真,HFSS中指数曲线绘制及曲面绘制。

and_future的博客 1万+

Ubuntu无桥接模式或连不上网(详细解决方法

目录 问题1:Ubuntu没有未桥接的主机网络适配器 解决方法 1.打开VMware安装目录下的文件 ​编辑2.右键安装以上三个文件 3.打开网络状态属性,找到VMware bridgeProtocol,点击安装 问题2.Ubuntu桥接模式连不上网 1.win+r打开cmd终端,输入ipconfig /all 2.记录以下数据 3.打开VMware网络设置 问题1:Ubuntu没有未桥接的主机网络适配器 VMWare安装之后,虚拟网络一直使用默认配置 VMnet0为...

m0_65592409的博客 6062

16. SAP Fiori Elements 应用里图片字段(Image)的显示原理介绍

很多朋友向我反映,学习了 一段时间的 SAP Fiori Elements 开发,但是感觉整套体系对于自己来说还是个黑盒子,很多技术点,看了 SAP 官方帮助文档后,觉得自己懂了,但是一旦需要自己动手做一些东西出来时,又觉得一片茫然。 其实笔者自己也经历过这个过程。究其原因,还是大家对 Fiori Elements 一些技术细节没有理解,对 SAP 官方的知识点仅仅停留在记忆,甚至是死记硬背上面。 不过没有关系,本教程笔者会刻意设置一些练习,让大家动手,在实战中逐渐熟悉 Fiori Elements 这

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 758

基于simulink的自动紧急制动系统(AEB)的功能验证

本文手把手指导使用Simulink构建自动紧急制动系统(AEB)模型,通过五个关键步骤完成功能验证:1)搭建车辆动力学模型;2)设计雷达传感器模型;3)开发基于碰撞时间(TTC)的决策逻辑;4)设计标准化测试场景;5)进行仿真分析。重点讲解了AEB的多级触发机制(预警、辅助制动、自动制动)和核心指标验证方法,包括制动时机判断、减速度性能等。通过典型场景仿真,展示了AEB如何在2.5秒TTC触发预警,1.2秒TTC启动自动制动,有效避免碰撞。文章还展望了行人AEB、传感器融合等进阶研究方向,为自动驾驶安全系统

amy_mhd的博客 267

数据分析案例-车辆二氧化碳排放量数据可视化分析

本实验数据集来源于Kaggle,该数据集捕获了车辆二氧化碳排放量随不同特征变化的详细信息。数据集取自加拿大政府官方开放数据网站。其中包含 7 年期间的数据。总共有 7385 行和 12 列。各列变量含义解释如下:Make:车辆的品牌或制造商。Model:车辆的具体车型名称。Vehicle Class:车辆的分类,如紧凑型、SUV等。Engine Size(L):车辆发动机的尺寸,以升为单位。Cylinders:车辆发动机的气缸数。

m0_64336780的博客 1万+

PyTorch深度学习实战(6)——神经网络性能优化技术

神经网络性能优化技术是指通过改进神经网络的结构、参数初始化、正则化和训练过程等方面来提高其性能和泛化能力的方法。优化技术的选择和调试需要根据具体问题进行,通过不断实验和调整,找到最适合网络的优化策略。本节首先训练了一个简单的全连接网络,然后在此基础上介绍了简单有效的神经网络性能提升技巧。

盼小辉丶的博客 1万+

如何在 R 中执行 Kruskal-Wallis 检验

Kruskal-Wallis 检验用于确定三个或更多独立组的中位数之间是否存在统计学上的显着差异。它被认为是单向方差分析的非参数等效项。本教程介绍了如何在 R 中执行 Kruskal-Wallis 检验。示例:R 中的 Kruskal-Wallis 检验 假设研究人员想知道三种不同的肥料是否会导致不同水平的植物生长。他们随机选择 30 种不同的植物并将它们分成三组,每组 10 株,每组施用不同的肥料。在一个月结束时,他们测量每株植物的高度。使用以下步骤执行 Kruskal-Wallis 检验以确定三个组的中

Mrrunsen的博客 3798

【自然语言处理】情感分析(一):基于 NLTK 的 Naive Bayes 实现

朴素贝叶斯(Naive Bayes)分类器可以用来确定输入文本属于某一组类别的概率。例如,预测评论是正面的还是负面的。它是 “朴素的”,它假设文本中的单词是独立的(但在现实的自然人类语言中,单词的顺序传达了上下文信息)。尽管有这些假设,但朴素贝叶斯在使用少量训练集预测类别时具有很高的准确性。

Data · Model · Agent · Repeat 2173

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

上一篇: Jetpact-activity组件完全解析
下一篇: Android-Flow 使用和源码解析
Bumblebee1999
博客等级 码龄11年 5粉丝 13原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值