Android ArrayMap 源码详解

1046 查看

分析源码之前先来介绍一下ArrayMap的存储结构,ArrayMap数据的存储不同于HashMap和SparseArray,在上一篇《Android SparseArray源码详解》中我们讲到SparseArray是以纯数组的形式存储的,一个数组存储的是key值一个数组存储的是value值,今天我们分析的ArrayMap和SparseArray有点类似,他也是以纯数组的形式存储,不过不同的是他的一个数组存储的是Hash值另一个数组存储的是key和value,其中key和value是成对出现的,key存储在数组的偶数位上,value存储在数组的奇数位上,我们先来看其中的一个构造方法

当capacity不为0的时候调用allocArrays方法分配数组大小,在分析allocArrays源码之前,我们先来看一下freeArrays方法,

BASE_SIZE的值为4,ArrayMap对于hashes.length为4和8的两种情况会进行缓存,上面的两种情况下原理都是一样的,我们就用下面的一种情况进行分析,缓存的数量也不是无线大的,当大于等于10(CACHE_SIZE)的时候也就不再进行缓存了,缓存的原理就是让array数组的第一个位置保存之前缓存的mBaseCache,第二个位置保存当前的hashes数组,其他的全部置为空,下面我们再来看一下之前的allocArrays方法,