博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SparseArray源码解析
阅读量:6345 次
发布时间:2019-06-22

本文共 1808 字,大约阅读时间需要 6 分钟。

转载自

No1:

Android官方推荐:当使用HashMap(K, V),如果K为整数类型时,使用SparseArray的效率更高.

No2:

HashMap是使用数组+链表的数据结构存储键值对,而SparseArray只是用了两个数组进行存储.

No3:

ContainerHelpers类提供了二分查找算法,从而降低了时间复杂度. 

// This is Arrays.binarySearch(), but doesn't do any argument validation.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}

No4:

put函数的步骤:

1)通过二分查找算法,计算key的索引值.

2)如果索引值大于0,说明有key对应的value存在,直接替换value即可.
3)如果索引值小于0,对索引值取反,获取key应该插入的坐标i.
4)判断是否需要扩容:1.需要扩容,则先扩容; 2.不需要扩容,则利用System.arraycopy移动相应的元素,进行(key,value)键值对插入

最终用到了这个函数

System.arraycopy(mKeys, 0, nkeys, 0, mKeys.length);

No5:

delete操作只是根据二分算法查找出key对应的下标,然后将object[] value中的对应下标值设置为DELETED.

No6:

delete()函数中将被删除的key对应的value设置为DELETED,并设置gc标志mGarbage为ture,SparseArray是在put函数的时候执行了gc:

gc函数的原理:遍历一遍数组,将非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);}

No7:

SparseArray vs HashMap:

1)首先,这是两种完全不同的数据结构.SparseArray是两个数组:int[]和Object[], HashMap是数组+链表.

2)查找效率上: 首先,SparseArray不需要对key进行hash运算,并且通过二分查找保证查询效率为O(lgn).而HashMap在未冲突的情况下是O(1),冲突的情况下是O(n).

你可能感兴趣的文章
List集合add使用过程中出现的错误
查看>>
可能是最简单的面向对象入门教程(一 ) 一个鸭子引发的血案
查看>>
有关Lambda的一些思考
查看>>
配置文件 /etc/profile出错导致ls,vi不能用
查看>>
直接插入排序 快速排序算法 直接选择排序
查看>>
回归算法比较(线性回归,Ridge回归,Lasso回归)
查看>>
NetBeans使用技巧
查看>>
如何学习复杂的知识,比如《算法导论》
查看>>
爬虫大作业
查看>>
大数据论述
查看>>
简单animate方法的封装
查看>>
JSON.parse()和JSON.stringify()
查看>>
常见网站
查看>>
JS框架avalon简单例子 行编辑 添加 修改 删除 验证
查看>>
linux 安装 bitnamid-redmine
查看>>
方法内部类
查看>>
不过的小东东
查看>>
随时更新
查看>>
python操作mongodb之七时间和时区
查看>>
MVVM开始
查看>>