Android | 为什么有了ArrayMap还要再设计SparseArray?

两者区别:Key的类型

  • ArrayMap:通用Key类型
kotlin 复制代码
// ArrayMap - 支持任何Object作为Key
val arrayMap = ArrayMap<String, Any>()
arrayMap.put("name", "Alice")
arrayMap.put("age", 25)

val arrayMap2 = ArrayMap<Any, Any>()
arrayMap2.put(CustomObject(), "value")
  • SparseArray:专用 int Key 类型
kotlin 复制代码
// SparseArray - 只支持int作为Key
val sparseArray = SparseArray<String>()
sparseArray.put(100, "Alice")  // Key 必须是 int
sparseArray.put(200, "Bob")

// 变种版本
val sparseIntArray = SparseIntArray()
sparseIntArray.put(100, 25)    // Key=int, Value=int

为什么需要SparseArray?

1. 避免自动装箱

ArrayMap 的存储方式:

vbnet 复制代码
mHashes: [hash("100"), hash("200")]  // String 的哈希值
mArray:  ["100", "Alice", "200", "Bob"]  // Key 被存储为 String 对象

SparseArray 的存储方式:

arduino 复制代码
mKeys:   [100, 200]           // 直接存储原始 int
mValues: ["Alice", "Bob"]     // 值数组

性能对比:

kotlin 复制代码
// ArrayMap - 需要自动装箱
val arrayMap = ArrayMap<Any, Any>()
arrayMap.put(100, "value")  // 发生装箱:int → Integer
val value = arrayMap.get(100) // 可能发生拆箱

// SparseArray - 无装箱开销
val sparseArray = SparseArray<String>()
sparseArray.put(100, "value")  // 直接存储原始 int
val value = sparseArray.get(100) // 直接使用原始 int

2. 内存优化

SparseArray 系列专门优化:

kotlin 复制代码
// 不同的原始值类型,避免任何装箱
SparseIntArray()      // int → int
SparseLongArray()     // int → long  
SparseBooleanArray()  // int → boolean
SparseArray<String>() // int → String (只有值可能装箱)

3. 更简单的哈希计算

ArrayMap:

java 复制代码
// 需要计算任意对象的 hashCode
int hash = key.hashCode();
// 可能处理哈希冲突

SparseArray:

java 复制代码
// 直接使用 int 值本身,无需计算哈希
int key = 100; // 这就是"哈希值"
// 不会有哈希冲突(除非相同的 key)

实际使用场景对比

  • 适合 SparseArray 的场景:
kotlin 复制代码
// 1. View的ID映射
val viewMap = SparseArray<View>()
viewMap.put(R.id.button_submit, submitButton)
viewMap.put(R.id.text_title, titleView)

// 2. 位置索引映射
val itemMap = SparseArray<ListItem>()
itemMap.put(0, headerItem)
itemMap.put(5, specialItem)
  • 适合 ArrayMap 的场景:
kotlin 复制代码
// 1. 字符串键的配置
val config = ArrayMap<String, Any>()
config.put("server_url", "https://api.example.com")
config.put("timeout", 5000)

// 2. Bundle 数据存储
val bundleData = ArrayMap<String, Any?>()

// 3. 任意对象键的映射
val objectMap = ArrayMap<Any, String>()

性能对比总结

方面 SparseArray ArrayMap HashMap
int Key 内存 最优 ❌ 需要装箱 ❌ 需要装箱
Object Key 支持 ❌ 不支持 ✅ 支持 ✅ 支持
查找性能 ✅ O(log n) ✅ O(log n) ✅ O(1)
插入性能 ⚠️ O(n) ⚠️ O(n) ✅ O(1)
内存占用 最低 ✅ 较低 ❌ 较高
  • SparseArray :为 int → Object 这种特定场景提供优化
  • ArrayMap :为通用的 Object → Object 映射提供平衡优化
  • HashMap :为大数据量高性能场景提供通用解决方案
相关推荐
Joseph Cooper42 分钟前
Linux/Android 跟踪技术:ftrace、TRACE_EVENT、atrace、systrace 与 perfetto 入门
android·linux·运维
空中海1 小时前
安卓逆向03. 动态调试、抓包分析与 Frida Hook
android
一起搞IT吧2 小时前
相机Camera日志实例分析之二十:相机Camx【照片后置4800/5000/6400万拍照】单帧流程日志详解
android·嵌入式硬件·数码相机·智能手机
jinanwuhuaguo3 小时前
(第三十三篇)五月的文明奠基:OpenClaw 2026.5.2版本的文明级解读
android·java·开发语言·人工智能·github·拓扑学·openclaw
千码君20165 小时前
Trae:一些关于flutter和 go前后端开发构建的分享
android·flutter·gradle·android-studio·trae·vibe code
重生之我是Java开发战士8 小时前
【MySQL】事务 & 用户与权限管理
android·数据库·mysql
怣疯knight10 小时前
Windows不安装 Android Studio如何打包安卓软件
android·windows·android studio
ke_csdn10 小时前
从Java演变到Kotlin下的jet pack
android
wenzhangli711 小时前
在低代码设计中践行 Harness Engineering
android·低代码·rxjava
xingpanvip12 小时前
星盘接口开发文档:组合三限盘接口指南
android·开发语言·前端·python·php·lua