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