val table = SparseArray<MappingData>();
table.put(propertyAreaId, mappingData);
一、SparseArray<MappingData> 尖括号里只有 1 个参数:泛型 E(存储的值类型)
1. SparseArray 底层定义
kotlin
class SparseArray<E>
- 只有一个泛型参数 E:代表数组里存的值(Value) 的类型
- SparseArray 的 Key 固定死了,只能是 Int,不需要泛型声明
- 它是安卓专用容器:
int → E的映射,key 强制 int,不用传泛型
你的代码
kotlin
val table = SparseArray<MappingData>()
含义:创建一个「Int 类型 key,MappingData 类型 value」的稀疏数组
二、put(key, value) 传 2 个参数:存入一组键值
put 方法签名:
kotlin
fun put(key: Int, value: E)
两个入参分工:
- 第一个参数
key: Int:索引键(固定 int,不用泛型定义) - 第二个参数
value: E:要存的对象,对应你声明的MappingData
kotlin
table.put(propertyAreaId, mappingData)
// propertyAreaId → Int键
// mappingData → MappingData值(对应泛型E)
三、和普通 Map 对比,一眼看懂区别
1. MutableMap<K,V>(两个泛型)
kotlin
// <Key类型, Value类型> 两个泛型参数
val map = mutableMapOf<Int, MappingData>()
map.put(1, MappingData()) // 同样两个入参 key+value
2. SparseArray(仅一个泛型)
因为 key 固定为 int,不用写,只声明 value 类型:
kotlin
val table = SparseArray<MappingData>()
table.put(1, MappingData())
四、核心总结一句话
- 声明
SparseArray<XXX>的<>里,只写值的类型,key 固定是 Int 不用填; put(a,b)是存数据的操作,必须传键、值两个参数;两者用途完全不一样,不存在参数数量对应关系。
补充小提示(你项目场景)
SparseArray 专门用来替代 HashMap<Int, Object>,性能更好,约束:
-
key 只能 int,不能用 Pair、String 做键
-
想要复合键(propId to areaId)不能用 SparseArray,只能用
Map<Pair<Int,Int>, MappingData>
五、 id1 or id2 解释:
val table = SparseArray<MappingData>()
table.put(1, MappingData())
table.put(id1 or id2, MappingData())
)
id1 or id2 是Kotlin 整数按位或运算,不是 “同时存入 id1、id2 两个 key”,只会算出单个数字作为 put 的唯一 key。
1. or 运算规则(二进制)
按位或:两个数字转为二进制,同一位置只要有一个是 1,结果位就是 1。举个例子:
plaintext
id1 = 1 → 二进制 0001
id2 = 2 → 二进制 0010
id1 or id2 = 3 → 二进制 0011
代码等价:
kotlin
// 只会存入 key=3,不会存1、2
table.put(3, MappingData())
2. 你这段代码完整拆解
kotlin
val table = SparseArray<MappingData>()
table.put(1, MappingData()) // key=1 存一条数据
table.put(id1 or id2, MappingData()) // 先计算 id1 | id2 得到一个数字X,仅 key=X 存一条数据
重大误区提醒
千万不要以为 id1 or id2 能一次性给 id1、id2 两个 key 赋值!SparseArray.put () 一次只能接收单个 Int key,or 是数学运算,不具备批量赋值能力。
3. 关键对比
表格
| 写法 | 作用 | 存入多少条数据 |
|---|---|---|
table.put(id1, data) | 单 key 存入 | 1 条(key=id1) |
table.put(id1 or id2, data) | 先运算得到新数字,单 key 存入 | 1 条(key = 运算结果) |
循环put(id1)、put(id2) | 分别存入两个独立 key | 2 条(key=id1、key=id2) |
4. 和 to 彻底区分,避免混淆
A to B:打包成 Pair 键值对,无数字计算,用于 Map 初始化 / 复合键;A or B:二进制数字运算,输出一个新整数,只能得到单个数字,不能批量存 key。