SparseArray 解析

? ?SparseArray是android里為<Integer,Object>的HashMap這樣的數(shù)據(jù)類型所寫的類,目的是提高效率,其核心算法是折半查找函數(shù)。

不同點(diǎn):

?1.SparseArray的key是int型,不是對象。

?2.HashMap底層是數(shù)組+鏈表結(jié)構(gòu),SparseArray是數(shù)組+數(shù)組結(jié)構(gòu)。因?yàn)殒湵淼臅r(shí)間復(fù)雜度比較高,所以SparseArray效率更高。

SparseArray源碼

/**??

?*?存儲(chǔ)索引集合.??

?*/??

private?int[]?mKeys;??

/**??

?*?存儲(chǔ)對象集合.??

?*/??

private?Object[]?mValues;??

/**??

?*?存儲(chǔ)的鍵值對總數(shù).??

?*/??

private?int?mSize;??

/**??

?*?采用默認(rèn)的構(gòu)造函數(shù),則初始容量為10.??

?*/??

public?SparseArray()?{??

????this(10);??

}??

/**??

?*?使用指定的初始容量構(gòu)造SparseArray.??

?*??

?*?@param?initialCapacity?初始容量??

?*/??

public?SparseArray(int?initialCapacity)?{??

if?(initialCapacity?==?0)?{??

????????//?Effective?Java中第43條:返回零長度的數(shù)組或者集合,而不是:null??

mKeys?=?ContainerHelpers.EMPTY_INTS;??

mValues?=?ContainerHelpers.EMPTY_OBJECTS;??

????}?else?{??

????????//?構(gòu)造initialCapacity大小的int數(shù)組和object數(shù)組??

mKeys?=?new?int[initialCapacity];??

mValues?=?new?Object[initialCapacity];??

????}??

//?設(shè)置SparseArray存儲(chǔ)的鍵值對個(gè)數(shù)為0.??

mSize?=?0;??

}??

重要方法:

put函數(shù)的邏輯:

通過二分查找算法,計(jì)算key的索引值.

如果索引值大于0,說明有key對應(yīng)的value存在,直接替換value即可.

如果索引值小于0,對索引值取反,獲取key應(yīng)該插入的坐標(biāo)i.

判斷是否需要擴(kuò)容:1.需要擴(kuò)容,則先擴(kuò)容; 2.不需要擴(kuò)容,則利用System.arraycopy移動(dòng)相應(yīng)的元素,進(jìn)行(key,value)鍵值對插入.


get函數(shù)就是利用二分查找獲取key的下標(biāo),然后從object[] value數(shù)組中根據(jù)下標(biāo)獲取值.

之所以SparseArray號稱比HashMap有更好的性能:

SparseArray更加節(jié)約內(nèi)存,一個(gè)int[]數(shù)組存儲(chǔ)所有的key,一個(gè)object[] 數(shù)組存儲(chǔ)所有的value.

HashMap遇到?jīng)_突時(shí),時(shí)間復(fù)雜度為O(n).而SparseArray不會(huì)有沖突,采用二分搜索算法,時(shí)間復(fù)雜度為O(lgn).


ContainerHelpers:采用二分法查找,提高了一定效率。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 一、基本數(shù)據(jù)類型 注釋 單行注釋:// 區(qū)域注釋:/* */ 文檔注釋:/** */ 數(shù)值 對于byte類型而言...
    龍貓小爺閱讀 4,468評論 0 16
  • 本系列出于AWeiLoveAndroid的分享,在此感謝,再結(jié)合自身經(jīng)驗(yàn)查漏補(bǔ)缺,完善答案。以成系統(tǒng)。 Java基...
    濟(jì)公大將閱讀 1,627評論 1 6
  • Java集合:HashMap源碼剖析 一、HashMap概述 二、HashMap的數(shù)據(jù)結(jié)構(gòu) 三、HashMap源碼...
    記住時(shí)光閱讀 784評論 2 1
  • 一、HashMap概述 HashMap基于哈希表的Map接口的實(shí)現(xiàn)。此實(shí)現(xiàn)提供所有可選的映射操作,并允許使用nul...
    小陳阿飛閱讀 676評論 0 2
  • 獵物天下 轉(zhuǎn)載2015-06-26 15:44:59 文/陳艷濤 每個(gè)物類都是衡量人類的尺度。陷在現(xiàn)代消費(fèi)主義困境...
    37dc9392ece7閱讀 333評論 0 1

友情鏈接更多精彩內(nèi)容