Android数据结构之SparseArray

Android对内存的要求比较严格

android为什么使用SparseArray代替HashMap???

  • HashMap在扩容时,HashMap的空间将会以2倍的规律进行增大。假如我们有几十万、几百万条数据,那么HashMap要存储完这些数据将要不断的扩容,而且在此过程中也需要不断的做hash运算,这将对我们的内存空间造成很大消耗和浪费。
  • SparseArray比HashMap更省内存,在某些条件下性能更好,主要是因为它避免了对key的自动装箱(int转为Integer类型),它内部则是通过两个数组来进行数据存储的,一个存储key,另外一个存储value,为了优化性能,它内部对数据还采取了压缩的方式来表示稀疏数组的数据,从而节约内存空间
  • 总的来说,SparseArray要更加节省内存

SparseArray不适合数据量大的情况的原因???

  • 如下代码所示,SparseArray在进行put操作时,使用到了System.arrayCopy,这个操作在数据量大的情况下是非常耗时的。
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++;
        }
    }
 public static <T> T[] insert(T[] array, int currentSize, int index, T element) {
        assert currentSize <= array.length;

        if (currentSize + 1 <= array.length) {
            System.arraycopy(array, index, array, index + 1, currentSize - index);
            array[index] = element;
            return array;
        }

        @SuppressWarnings("unchecked")
        T[] newArray = ArrayUtils.newUnpaddedArray((Class<T>)array.getClass().getComponentType(),
                growSize(currentSize));
        System.arraycopy(array, 0, newArray, 0, index);
        newArray[index] = element;
        System.arraycopy(array, index, newArray, index + 1, array.length - index);
        return newArray;
    }
  • 总结
    • 无论数据量大还是小,SparseArray比HashMap所占的内存都要小
    • SparseArray在添加、获取数据时,都要使用二分查找,对于数据量比较大的情况下,效率比HashMap要低。
    • SparseArray牺牲效率来换取内存

SparseArray适用场景

  • 数据量不大,在千级以内
  • key必须为int类型,这种情况下HashMap可以用SparseArray代替

猜你喜欢

转载自blog.csdn.net/reuxfhc/article/details/80786257