美文网首页
SparseArray

SparseArray

作者: nich | 来源:发表于2022-11-23 17:25 被阅读0次

sparseArray其实里面维护了两个数组来存储数据
private int[] mKeys;存key通过二分法查找
private Object[] mValues;存value
private int mSize;

   //初始化
   public SparseArray(int initialCapacity) {
        if (initialCapacity == 0) {
            mKeys = EmptyArray.INT;
            mValues = EmptyArray.OBJECT;
        } else {
            mValues = ArrayUtils.newUnpaddedObjectArray(initialCapacity);
            mKeys = new int[mValues.length];
        }
        mSize = 0;
    }

最主要的方法是put

 public void put(int key, E value) {
//查询key的下标获取index
        int i = ContainerHelpers.binarySearch(mKeys, mSize, key);
//如果查询到了下标就赋值
        if (i >= 0) {
            mValues[i] = value;
        } else {
//如果查询不到取反再处理
            i = ~i;
     //如果下标小于size,该位的值为DELETED,就赋值
            if (i < mSize && mValues[i] == DELETED) {
                mKeys[i] = key;
                mValues[i] = value;
                return;
            }
           //如果需要gc&&size>key的长度
            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++;
        }
    }
里面有两个主要方法ContainerHelpers.binarySearch()和gc()

二分法查找下标
 static int binarySearch(int[] array, int size, int value) {
        int lo = 0;
        int hi = size - 1;
        while (lo <= hi) {
            final int mid = (lo + hi) >>> 1;
            final int midVal = array[mid];

            if (midVal < value) {
                lo = mid + 1;
            } else if (midVal > value) {
                hi = mid - 1;
            } else {
                return mid;  // value found
            }
        }
        return ~lo;  // value not present
    }

//其实是为了清掉value是DELETED的数据
  private void gc() {
        // Log.e("SparseArray", "gc start with " + mSize);

        int n = mSize;
        int o = 0;
        int[] keys = mKeys;
        Object[] values = mValues;

        for (int i = 0; i < n; i++) {
            Object val = values[i];

            if (val != DELETED) {
                if (i != o) {
                    keys[o] = keys[i];
                    values[o] = val;
                    values[i] = null;
                }

                o++;
            }
        }
        mGarbage = false;
        mSize = o;
        // Log.e("SparseArray", "gc end with " + mSize);
    }

其他好像都没啥

相关文章

网友评论

      本文标题:SparseArray

      本文链接:https://www.haomeiwen.com/subject/ehmzxdtx.html