一、put操作的分析:
array扩容的逻辑:
将一个新元素 element 添加到数组中特定的 index 上面:
1)判断 array 如果不需要扩容,则直接通过 System.arraycopy 进行数组的移位,然后插入目标数组
2)若需要扩容, 则通过 Array.newInstance(array.getClass().getComponentType(), growSize(currentSize) 进行新数组的创建
SparseArray中的 put 方法调用:
1) key 已经存在 mKeys 中,则直接将 mValues 对应的值进行设置
2)如果没有找到,则对 ~i 的位置进行确定 mValues 是否已经被 DELETED , 如果是,则可以把 key 、value 插入对应的位置
3)如果设置了 mGarbage 且 总数已经超了 mKeys 数组的大小,则进行数组压缩
4)通过 GrowingArrayUtils 进行数组的扩容并插入对应的 key
其中 gc()的逻辑为:根据 mValues 中对象是否存在,来进行数组的压缩整理
二、get操作 (注意valueAt() 并不是通过 key 来查找对应的 value 方式)
对 mKey 进行二分查找:在 mKeys 对 key 存储的位置进行二分查找
1)查询到,则返回对应的 index
2)查询不到,则返回二分查找最后index的下标(以 ~ 的方式来返回,一般均为负数,用来和查询到进行区分),便于在上层处理中,再进行一次 ~ 运算,获取到应该将元素插入到什么位置