一、put操作的分析:
array擴(kuò)容的邏輯:

clipboard.png
將一個(gè)新元素 element 添加到數(shù)組中特定的 index 上面:
1)判斷 array 如果不需要擴(kuò)容,則直接通過 System.arraycopy 進(jìn)行數(shù)組的移位,然后插入目標(biāo)數(shù)組
2)若需要擴(kuò)容, 則通過 Array.newInstance(array.getClass().getComponentType(), growSize(currentSize) 進(jìn)行新數(shù)組的創(chuàng)建

clipboard1.png
SparseArray中的 put 方法調(diào)用:
1) key 已經(jīng)存在 mKeys 中,則直接將 mValues 對(duì)應(yīng)的值進(jìn)行設(shè)置
2)如果沒有找到,則對(duì) ~i 的位置進(jìn)行確定 mValues 是否已經(jīng)被 DELETED , 如果是,則可以把 key 、value 插入對(duì)應(yīng)的位置
3)如果設(shè)置了 mGarbage 且 總數(shù)已經(jīng)超了 mKeys 數(shù)組的大小,則進(jìn)行數(shù)組壓縮
4)通過 GrowingArrayUtils 進(jìn)行數(shù)組的擴(kuò)容并插入對(duì)應(yīng)的 key

clipboard2.png
其中 gc()的邏輯為:根據(jù) mValues 中對(duì)象是否存在,來進(jìn)行數(shù)組的壓縮整理

clipboard3.png
二、get操作 (注意valueAt() 并不是通過 key 來查找對(duì)應(yīng)的 value 方式)

clipboard4.png
對(duì) mKey 進(jìn)行二分查找:在 mKeys 對(duì) key 存儲(chǔ)的位置進(jìn)行二分查找
1)查詢到,則返回對(duì)應(yīng)的 index
2)查詢不到,則返回二分查找最后index的下標(biāo)(以 ~ 的方式來返回,一般均為負(fù)數(shù),用來和查詢到進(jìn)行區(qū)分),便于在上層處理中,再進(jìn)行一次 ~ 運(yùn)算,獲取到應(yīng)該將元素插入到什么位置

clipboard5.png
三、delete 操作:(注意區(qū)分 removeAt 與 remove 的關(guān)系 )
并不會(huì)直接將對(duì)應(yīng)的 mValues 中 i 位置的元素設(shè)置為 null, 而是設(shè)置為 DELETED, 用于后續(xù) mKeys 數(shù)組的壓縮

clipboard7.png