Android中SparseArray源码分析完结【增(改)、删、查】

一、put操作的分析:

array扩容的逻辑:

clipboard.png

将一个新元素 element 添加到数组中特定的 index 上面:

1)判断 array 如果不需要扩容,则直接通过 System.arraycopy 进行数组的移位,然后插入目标数组
2)若需要扩容, 则通过 Array.newInstance(array.getClass().getComponentType(), growSize(currentSize) 进行新数组的创建


clipboard1.png

SparseArray中的 put 方法调用:

1) key 已经存在 mKeys 中,则直接将 mValues 对应的值进行设置
2)如果没有找到,则对 ~i 的位置进行确定 mValues 是否已经被 DELETED , 如果是,则可以把 key 、value 插入对应的位置
3)如果设置了 mGarbage 且 总数已经超了 mKeys 数组的大小,则进行数组压缩
4)通过 GrowingArrayUtils 进行数组的扩容并插入对应的 key


clipboard2.png

其中 gc()的逻辑为:根据 mValues 中对象是否存在,来进行数组的压缩整理

clipboard3.png

二、get操作 (注意valueAt() 并不是通过 key 来查找对应的 value 方式)

clipboard4.png

对 mKey 进行二分查找:在 mKeys 对 key 存储的位置进行二分查找

1)查询到,则返回对应的 index
2)查询不到,则返回二分查找最后index的下标(以 ~ 的方式来返回,一般均为负数,用来和查询到进行区分),便于在上层处理中,再进行一次 ~ 运算,获取到应该将元素插入到什么位置


clipboard5.png

三、delete 操作:(注意区分 removeAt 与 remove 的关系 )

并不会直接将对应的 mValues 中 i 位置的元素设置为 null, 而是设置为 DELETED, 用于后续 mKeys 数组的压缩

clipboard7.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 一、基本数据类型 注释 单行注释:// 区域注释:/* */ 文档注释:/** */ 数值 对于byte类型而言...
    龙猫小爷阅读 4,291评论 0 16
  • 内存优化前我们先了解一些和内存相关的概念: 垃圾回收 内存抖动 四种引用 内存泄露 下面我们回到正题, 讲一下如何...
    MZzF2HC阅读 1,738评论 0 6
  • 本系列出于AWeiLoveAndroid的分享,在此感谢,再结合自身经验查漏补缺,完善答案。以成系统。 Java基...
    济公大将阅读 1,540评论 1 6
  • 怎么形容遇见你呢 就像夏日闷热午后 突如其来的一场雨 惊慌失措的同时 大概更多的是欣喜吧
    li艾chun阅读 225评论 1 3
  • 设置学习率alpha很重要,感觉随机梯度下降不容易收敛。
    Jerrybio阅读 208评论 0 1