最近听同事说使用SparseArray代替HashMap可以提高性能,于是边对这两个类的数据结构进行简单的分析。
Hashmap的数据结构
Hashmap是一个数组和链表的结合体(在数据结构称“链表散列“),如下图示:
SparseArray的数据结构
SparseArray指的是稀疏数组(Sparse array),为了节省内存空间,并且不影响数组中原有的内容值。其内部有两个关键成员,分别是mKeys和mValues, 都是数组,如下所示:
查看其 put(int key, E value),如下: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差不多,不能直观判断出好坏,需要分情况讨论。
原文地址:http://blog.csdn.net/bigconvience/article/details/45973131