ArrayMap源码的分析,
ArrayMap实现了Map接口,所以它也是一个数组加链表(或红黑树),结构也是哈希表。它是线程不安全的,它允许key为null,value为null。相比于HashMap,ArrayMap空间效率更高。
ArrayMap内部维护了两个数组,
- 1,一个int[]数组,用户保存每个item的hashCode值
- 2,一个Object[]数组,用于保存key–value对。容量上是一个数组的两倍它可以避免在将数据插入Map中时额外的空间消耗(相比于HashMap)。它的扩容只需要进行数组拷贝,不需要重建哈希表(相比于HashMap的扩容)。
和HashMap相比,ArrayMap不仅仅有扩容功能,在删除时,如果集合剩余元素少于一定阈值时,还有收缩功能,这样可以减少空间的浪费。毕竟是Android团队专门为Android新增的api,肯定考虑了移动设备内存很珍贵的因素。
对于哈希碰撞的解决方式,ArrayMap用的是开放地址法,ArrayMap不适用于大容量的数据存储,存储大量数据时,它的性能将退化至少50%,比传统的HashMap时间效率低。因为其会对key从小到大排序,使用二分法查询key对应在数组中的下标,在添加、删除、查找数据的时候都是先使用二分查找法得到相应的index,然后通过index来进行添加、查找、删除等操作。所以其是按照key的大小排序存储的。
ArrayMap的使用场景: