ArrayMap简析
ArrayMap
ArrayMap是Android提供的轻量级Map实现,核心目标是用更低的内存开销替代部分HashMap场景。
典型特点:
key/value存储在数组中,避免HashMap.Entry对象开销- 查询依赖
hash有序数组 + 二分查找 - 更适合中小规模数据,且对内存敏感的场景
适用场景
- 数据量中小(例如几十到几百)
- 读多写少,结构相对稳定
- 运行在内存敏感路径(UI层、短生命周期对象)
不适用:
- 大规模高频写入
- 多线程并发读写
核心数据结构
ArrayMap(基于SimpleArrayMap)主要维护两组数组:
mHashes:按升序保存key的hash值(int[])mArray:交替存储key/value(Object[],[k0,v0,k1,v1,...])
这种结构减少对象数量,但插入/删除中间位置时需要数组搬移。
关键操作流程
put
- 通过二分查找定位hash位置
- hash冲突时线性探测相邻区间比对key
- 找到则覆盖value;未找到则插入并可能触发扩容/搬移
get
- 二分定位hash
- 冲突区间按
equals比对key - 返回对应value
remove
- 删除后会进行数组搬移,必要时触发容量收缩
扩容与缓存池(补充)
ArrayMap内部对小数组(常见4/8容量)有复用池策略,减少频繁分配带来的GC压力。
注意:
- 复用池是实现细节,不应依赖其行为做业务假设
- 高频增删场景仍可能出现明显搬移成本
与HashMap / SparseArray对比
HashMap:大数据量、写入频繁时通常更稳ArrayMap:中小数据量下更省内存SparseArray:当key为int时,通常优先于ArrayMap<Integer, V>
使用注意事项
- 非线程安全:多线程场景需要外部同步
- 遍历过程中修改结构,可能触发
ConcurrentModificationException - 不要在热路径里盲目替换
HashMap,应结合真实数据规模做压测
小结
ArrayMap本质是“以时间换空间”的中小规模Map实现。选型关键看三点:
- 数据规模
- 读写比例
- 是否内存敏感
ArrayMap简析
https://leo-wxy.github.io/2019/03/08/Android-ArrayMap简析/