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")<

本文详细解析了Jetpack Lifecycle组件中的SafeIterableMap数据结构,它是一个基于链表实现,支持在遍历过程中安全删除数据的类。文章介绍了FastSafeIterableMap的核心方法,包括添加、查找和删除操作,以及不同类型的迭代器实现,如升序和降序迭代器。虽然线程不安全,但其在Jetpack组件中的应用值得关注。
最低0.47元/天 解锁文章
748





