首先,SimpleArrayMap的设计,是为了在对内存空间的使用上,要优于HashMap。因为HashMap在分配空间时是使使用空间倍增,且对空间的使用率因具体环境而定,也就是说HashMap为了保证它高速定位的特性,要牺牲很多内存空间,在Android里内存空间异常珍贵,因为,引入了SimpleArrayMap。
接着,当说起SimpleArrayMap,不能不提及ArrayMap。在本质上,这两个数据结构是同样的东西,只不多ArrayMap提供了可以使用Java的API集合的标准方式来操作数据,且ArrayMap拥有EntrySet。SimpleArrayMap是以键值对的方式将数据关联起来,然后利用Hash值进行定位,下面开始说源码
构造SimpleArrayMap
public SimpleArrayMap();
public SimpleArrayMap(int capacity);
public SimpleArrayMap(SimpleArrayMap map);
SimpleArrayMap拥有三个构造函数,一种使用默认大小,一种使用指定大小,还有一种接受另一个SimpleArrayMap
public SimpleArrayMap(int capacity) {
if (capacity == 0) {
mHashes = ContainerHelpers.EMPTY_INTS;
mArray = ContainerHelpers.EMPTY_OBJECTS;
} else {
allocArrays(capacity);
}
mSize = 0;
}
在接收指定大小构造上,会调用到allocArrays(),此函数完成了对内存空间的有效利用,后面再加以说明。
// 分配空间的步增,也是利用内存空间的依据
private static final int BASE_SIZE = 4;
private static final int CACHE_SIZE = 10;
// 内存空间的缓存
static Object[] mBaseCache;
// 缓存了几组SimpleArrayMap结构的空间
static int mBaseCacheSize;
// 内存空间的缓存 与上差别为容量大小
static Object[] mTwiceBaseCache;
// 缓存了几组SimpleArrayMap结构的空间
static int mTwiceBaseCacheSize;
//hash值
int[] mHashes;
//hash值对应的对象
Object[] mArray;
int mSize;
SimpleArrayMap维护的参数已做说明,不多阐述
SimpleArrayMap对空间的利用
在simpleArrayMap使用allocArrays()和freeArrays()完成了对内存空间的利用,前者在分配空间或构造使使用,后者在释放时使用。基本原理在于,当键值对数组mArray和哈希值数组mArray不再使用时,如果这两个数组满足一定条件,就不会马上将他们释放掉,而是存起来,以便在构造或分配空间时候重建利用这一段内存空间。
首先看freeArrays()
private static void freeArrays(final int[] hashes, final Object[] array, final int size) {
if (hashes.length == (BASE_SIZE*2)) {
synchronized (ArrayMap.class) {
if (mTwiceBaseCacheSize < CACHE_SIZE) {
array[