最近听同事说使用SparseArray代替HashMap可以提高性能,于是边对这两个类的数据结构进行简单的分析。
Hashmap的数据结构
Hashmap是一个数组和链表的结合体(在数据结构称“链表散列“),如下图示:
SparseArray的数据结构
SparseArray指的是稀疏数组(Sparse array),为了节省内存空间,并且不影响数组中原有的内容值。其内部有两个关键成员,分别是mKeys和mValues, 都是数组,如下所示:
public void put(int key, E value) {
int i = ContainerHelpers.binarySearch(mKeys, mSize, key);
if (i >= 0) {
mValues[i] = value;
} else {
i = ~i;
if (i < mSize && mValues[i] == DELETED) {
mKeys[i] = key;
mValues[i] = value;
return;
}
if (mGarbage && mSize >= mKeys.length) {
gc();
// Search again because indices may have changed.
i = ~ContainerHelpers.binarySearch(mKeys, mSize, key);
}
mKeys = GrowingArrayUtils.insert(mKeys, mSize, i, key);
mValues = GrowingArrayUtils.insert(mValues, mSize, i, value);
mSize++;
}
由此可见,SparseArray是android里为<Interger,Object>这样的Hashmap而专门写的类, 其核心是折半查找函数(binarySearch),这样可以加快查找效率,但有数据插入或删除时,效率不见得高。内存效率应该和HashMap差不多,不能直观判断出好坏,需要分情况讨论。