SparseArray的使用:

10 阅读3分钟
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)

两个入参分工:

  1. 第一个参数 key: Int:索引键(固定 int,不用泛型定义)
  2. 第二个参数 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())

四、核心总结一句话

  1. 声明 SparseArray<XXX><> 里,只写值的类型,key 固定是 Int 不用填;
  2. 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 id2Kotlin 整数按位或运算,不是 “同时存入 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 keyor 是数学运算,不具备批量赋值能力。

3. 关键对比

表格

写法作用存入多少条数据
table.put(id1, data)单 key 存入1 条(key=id1)
table.put(id1 or id2, data)先运算得到新数字,单 key 存入1 条(key = 运算结果)
循环put(id1)、put(id2)分别存入两个独立 key2 条(key=id1、key=id2)

4. 和 to 彻底区分,避免混淆

  • A to B:打包成 Pair 键值对,无数字计算,用于 Map 初始化 / 复合键;
  • A or B:二进制数字运算,输出一个新整数,只能得到单个数字,不能批量存 key。