Android创造的ArrayMap和SparseArray
ArrayMap和SparseArray,都是采取时间换取空间的方式来提高手机App的运行效率。
1.在数据量小的时候一般认为1000以下,当你的key为int的时候,使用 SparseArray 确实是一个很不错的选择,内存大概能节省30%,相比用HashMap,因为它key值不需要装箱,所以时间性能平均来看也优于HashMap,建议使用!
2.ArrayMap相对于SparseArray,特点就是key值类型不受限,任何情况下都可以取代HashMap,但是ArrayMap的内存节省并不明显,也就在10%左右,时间性能却是最差的,当然了,1000以内的数据量也无所谓了。
ArrayMap
- 两个数组来存储;key的hash数据,key-value组成的数组;
- 通过index来映射,2倍位置为key, 2倍位置+1 为value;
- mHashes数据,是从小到大有序存储的
- key是可以为null,null是hash值为0。不为空时,和mIdentityHashCode有关,仅可以在构造器中设置,默认为false
hashcode = mIdentityHashCode ? System.identityHashCode(key) : key.hashCode()
- 应用场景:
- item数量小于1000,尤其是插入数据和删除数据不频繁的情况。
- Map中包含子Map对
- 初始化
- 大小为0时,赋值空数组
- 大小为4个,优先从mBaseCache(容量大小为8)找有效数组
- 大小为8,优先从mTwiceBaseCache(容量大小为16)找有效数组
- 扩容:调用下面两个方法时,可能会扩容
public void ensureCapacity(int minimumCapacity) public V put(K key, V value)
数组的移动System.arraycopy方法处理,如果容器大小增加了,则废弃的数组;废弃的数组,进行回收,如果存储容量大小为4或者8,会放入缓存中
- 索引查找
1. 进行二分查找,先查找到一个hash相等的位置; 2. 根据查找的位置,若相等则返回查找位置 3. 依据hash值相等,往后查找,若key相等,则返回,hash不等则结束;这时位置跟随hash相等而向后移动 4. 依据hash值相等,往后查找,若key相等,则返回,hash不等则结束 5. 没有找到,返回前面四步处理后的位置,并取非操作,返回负数值
- 删除数据时,可能会进行容量缩减
SparseArray
- 为稀疏数据准备的;
- 也是两个数组,存储数组索引的key,存储数据value,通过相等索引来映射;
- mKeys是从小到大有序存储的
- key值只能为int 类型,value值为Object类型
- 应用场景:数据量不大,最好在千级以内
- 与ArrayMap的区别
- list集合
- 没有缓存机制
- 扩容大小不同;如果小于等于4,变为8,否则2倍扩容
- 排序以key排序(ArrayMap是以key的hash排序),数据只存储int类型的value值,key为稀疏数组的索引;
- 位置查找时,直接进行二分查找,找到即为插入位置
- 删除数据时,对容量大小不做处理