Android ArrayMap
ArrayMap 是一种键值映射的数据结构,比 HashMap 更节省内存
。它通过数组来存储映射关系,一个 int 数组存储 key 的 hash code,一个 Object 数组存储 key 和 value
,可以避免在插入元素到 map 时创建额外的对象。
- ArrayMap 和 HashMap 类似。HashMap 是以空间换时间,ArrayMap 是以时间换空间。
- 节省内存。缓存机制(缓存 4 和 8 时的数组)。
- 非线程安全;
- 二分查找;
- 扩容机制。4 -> 8 -> 8+8/2=12 -> 12+12/2=18
基于 androidx.collection:collection:1.1.0.
类结构
1 | /** |
- mHashes 记录所有 key 的 hashcode 值组成的数组,
从小到大
排序,使用二分查找; - mArray 是一个记录着 key-value 键值对所组成的数组,是 mHashes 大小的 2 倍;
构造方法
1 | /** |
默认的构造函数不分配内存,添加数据时根据需要分配,也可以在初始化时指定 ArrayMap 的大小,此时会分配内存。
添加数据
- V put(K key, V value)
- V putIfAbsent(K key, V value)
- void putAll(@NonNull SimpleArrayMap<? extends K, ? extends V> array)
key 可以为 null,但是至多有一个 null key。如果 key 不存在,返回 null, 否则返回旧 value。
1 | /** |
查找数据
- V get(Object key)
- V getOrDefault(Object key, V defaultValue)
1 |
|
主要是通过二分查找得到 key 在 mHashes 数组中的位置 index,再根据 index 在 mArray 数组中得到查找的值。
删除数据
- V remove(Object key)
- boolean remove(Object key, Object value)
- V removeAt(int index)
1 | /** |
缓存机制
1 | //只缓存长度是 4 和 8 的数组 |
缓存的第一条元素缓存 key-value 数组,第二条元素缓存 hash 数组。
相关的数据结构
- ArraySet
- SparseArray/SparseBooleanArray/SparseIntArray
- LongSparseArray