zoukankan      html  css  js  c++  java
  • SparseArray类

    继续阅读SparseArray的源码,从构造方法我们可以看出,它和一般的List一样,可以预先设置容器大小,默认的大小是10:

       
        public SparseArray() {
            this(10);
        }
    
        public SparseArray(int initialCapacity) {
            initialCapacity = ArrayUtils.idealIntArraySize(initialCapacity);
    
            mKeys = new int[initialCapacity];
            mValues = new Object[initialCapacity];
            mSize = 0;
        }

    再来看看它对数据的“增删改查”。

    它有两个方法可以添加键值对:

     public void put(int key, E value) {}
     public void append(int key, E value){}

    有四个方法可以执行删除操作:

     public void delete(int key) {}
     public void remove(int key) {} //直接调用的delete(int key)
     public void removeAt(int index){}
     public void clear(){}

    修改数据起初以为只有setValueAt(int index, E value)可以修改数据,但后来发现put(int key, E value)也可以修改数据,我们查看put(int key, E value)的源码可知,在put数据之前,会先查找要put的数据是否已经存在,如果存在就是修改,不存在就添加。

        public void put(int key, E value) {
            int i = binarySearch(mKeys, 0, 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 = ~binarySearch(mKeys, 0, mSize, key);
                }
                …………

    所以,修改数据实际也有两种方法:

     public void put(int key, E value)
     public void setValueAt(int index, E value)

    最后再来看看如何查找数据。有两个方法可以查询取值:

     public E get(int key)
     public E get(int key, E valueIfKeyNotFound)

    其中get(int key)也只是调用了 get(int key,E valueIfKeyNotFound),最后一个从传参的变量名就能看出,传入的是找不到的时候返回的值.get(int key)当找不到的时候,默认返回null。

    查看第几个位置的键:

     public int keyAt(int index)

    有一点需要注意的是,查看键所在位置,由于是采用二分法查找键的位置,所以找不到时返回小于0的数值,而不是返回-1。返回的负值是表示它在找不到时所在的位置。

    查看第几个位置的值:

     public E valueAt(int index)

    查看值所在位置,没有的话返回-1:

     public int indexOfValue(E value)

    最后,发现其核心就是折半查找函数(binarySearch),算法设计的很不错。

        private static int binarySearch(int[] a, int start, int len, int key) {
            int high = start + len, low = start - 1, guess;
    
            while (high - low > 1) {
                guess = (high + low) / 2;
    
                if (a[guess] < key)
                    low = guess;
                else
                    high = guess;
            }
    
            if (high == start + len)
                return ~(start + len);
            else if (a[high] == key)
                return high;
            else
                return ~high;
        }

    相应的也有SparseBooleanArray,用来取代HashMap<Integer, Boolean>,SparseIntArray用来取代HashMap<Integer, Integer>,大家有兴趣的可以研究。

    总结:SparseArray是android里为<Interger,Object>这样的Hashmap而专门写的类,目的是提高效率,其核心是折半查找函数(binarySearch)。在Android中,当我们需要定义

    HashMap<Integer, E> hashMap = new HashMap<Integer, E>();

    时,我们可以使用如下的方式来取得更好的性能.

    SparseArray<E> sparseArray = new SparseArray<E>();
  • 相关阅读:
    Clever Y POJ
    Searching the String ZOJ
    DNA repair HDU
    考研路茫茫——单词情结 HDU
    DNA Sequence POJ
    病毒侵袭持续中 HDU
    C语言结构体和联合体
    c语言趣味
    c语言指针
    c语言指针难点
  • 原文地址:https://www.cnblogs.com/mxxhit/p/4252693.html
Copyright © 2011-2022 走看看