關(guān)于SparseArray

作用

用來(lái)替代key為int的HashMap

分析

源碼中的相關(guān)分析:

package android.util;  
  
import com.android.internal.util.ArrayUtils;  
  
/** 
 * SparseArrays 利用integer去管理object對(duì)象。不像一個(gè)正常的object對(duì)象數(shù)組,它能在索引數(shù)中快速的查找到所需的結(jié)果粒没。(這 
 * 句話是音譯,原意是能在眾多索引數(shù)中“撕開一個(gè)缺口”,為什么原文這么表達(dá)?下面會(huì)慢慢說(shuō)清楚倾贰。)它比HashMap去通過(guò)Integer索引 
 * 查找object對(duì)象時(shí)在內(nèi)存上更具效率,不僅因?yàn)樗苊饬擞脕?lái)查找的自動(dòng)“裝箱”的keys,并且它的數(shù)據(jù)結(jié)構(gòu)不依賴額外的對(duì)象去 
 * 各個(gè)映射中查找匹配滚粟。 
 *  
 * SparseArrays map integers to Objects.  Unlike a normal array of Objects, 
 * there can be gaps in the indices.  It is intended to be more memory efficient 
 * than using a HashMap to map Integers to Objects, both because it avoids 
 * auto-boxing keys and its data structure doesn't rely on an extra entry object 
 * for each mapping. 
 * 
 * 請(qǐng)注意寻仗,這個(gè)容器會(huì)保持它的映射關(guān)系在一個(gè)數(shù)組的數(shù)據(jù)結(jié)構(gòu)中刃泌,通過(guò)二分檢索法驅(qū)查找key。(這里我們終于知道署尤,為何這個(gè)工具類中耙替, 
 * 提供的添加映射關(guān)系的操作中,key的類型必須是integer曹体。因?yàn)槎謾z索法俗扇,將從中間“切開”,integer的數(shù)據(jù)類型是實(shí)現(xiàn)這種檢索過(guò)程的保證箕别。) 
 *  
 * 如果保存大量的數(shù)據(jù)铜幽,這種數(shù)據(jù)結(jié)構(gòu)是不適合的,換言之串稀,SparseArray這個(gè)工具類并不應(yīng)該用于存儲(chǔ)大量的數(shù)據(jù)除抛。這種情況下,它的效率 
 * 通常比傳統(tǒng)的HashMap更低母截,因?yàn)樗牟檎曳椒ú⑶以黾雍鸵瞥僮鳎ㄈ我庖粋€(gè)操作)都需要在數(shù)組中插入和刪除(兩個(gè)步驟才能實(shí)現(xiàn))到忽。 
 *  
 * 如果存儲(chǔ)的數(shù)據(jù)在幾百個(gè)以內(nèi),它們的性能差異并不明顯清寇,低于50%喘漏。 
 *  
 * (OK,那么光看Android官方的介紹我們就有初步結(jié)論了华烟,大量的數(shù)據(jù)我們相對(duì)SparseArray會(huì)優(yōu)先選擇HashMap翩迈,如果數(shù)據(jù)在幾百個(gè)這個(gè)數(shù)目, 
 *  那么選擇它們?nèi)我庖粋€(gè)去實(shí)現(xiàn)區(qū)別不大盔夜,如果數(shù)量較少负饲,就選擇SparseArray去實(shí)現(xiàn)。 其實(shí)如果我們理解了二分法比吭,就很容易了SparseArray的 
 *  實(shí)現(xiàn)原理绽族,以及SparseArray和HashMap它們之間的區(qū)別了。) 
 *  
 * <p>Note that this container keeps its mappings in an array data structure, 
 * using a binary search to find keys.  The implementation is not intended to be appropriate for 
 * data structures 
 * that may contain large numbers of items.  It is generally slower than a traditional 
 * HashMap, since lookups require a binary search and adds and removes require inserting 
 * and deleting entries in the array.  For containers holding up to hundreds of items, 
 * the performance difference is not significant, less than 50%.</p> 
 * 
 *   
 * 為了提高性能衩藤,這個(gè)容器包含了一個(gè)實(shí)現(xiàn)最優(yōu)的方法:當(dāng)移除keys后為了立刻使它的數(shù)組緊密吧慢,它會(huì)“遺留”已經(jīng)被移除(標(biāo)記了要?jiǎng)h除)的條目(entry) 。 
 * 所被標(biāo)記的條目(entry)(還未被當(dāng)作垃圾回收掉前)可以被相同的key復(fù)用赏表,也會(huì)在垃圾回收機(jī)制當(dāng)作所有要回收的條目的一員被回收检诗,從而使存儲(chǔ)的數(shù)組更緊密匈仗。 
 *  
 * (我們下面看源碼就會(huì)發(fā)現(xiàn)remove()方法其實(shí)是調(diào)用delete()方法的。印證了上面這句話所說(shuō)的這種優(yōu)化方法逢慌。 
 * 因?yàn)檫@樣悠轩,能在每次移除元素后一直保持?jǐn)?shù)組的數(shù)據(jù)結(jié)構(gòu)是緊密不松散的。) 
 *  
 * 垃圾回收的機(jī)制會(huì)在這些情況執(zhí)行:數(shù)組需要擴(kuò)充攻泼,或者映射表的大小被恢復(fù)火架,或者條目值被重新檢索后恢復(fù)的時(shí)候。 
 *   
 * <p>To help with performance, the container includes an optimization when removing 
 * keys: instead of compacting its array immediately, it leaves the removed entry marked 
 * as deleted.  The entry can then be re-used for the same key, or compacted later in 
 * a single garbage collection step of all removed entries.  This garbage collection will 
 * need to be performed at any time the array needs to be grown or the the map size or 
 * entry values are retrieved.</p> 
 * 
 * 當(dāng)調(diào)用keyAt(int)去獲取某個(gè)位置的key的鍵的值忙菠,或者調(diào)用valueAt(int)去獲取某個(gè)位置的值時(shí)何鸡,可能是通過(guò)迭代容器中的元素 
 * 去實(shí)現(xiàn)的。 
 * 
 * <p>It is possible to iterate over the items in this container using 
 * {@link #keyAt(int)} and {@link #valueAt(int)}. Iterating over the keys using 
 * <code>keyAt(int)</code> with ascending values of the index will return the 
 * keys in ascending order, or the values corresponding to the keys in ascending 
 * order in the case of <code>valueAt(int)<code>.</p> 
 */  
public class SparseArray<E> implements Cloneable {  
    //...  
}  
package android.util;  
  
import com.android.internal.util.ArrayUtils;  
  
/** 
 * SparseArrays 利用integer去管理object對(duì)象牛欢。不像一個(gè)正常的object對(duì)象數(shù)組骡男,它能在索引數(shù)中快速的查找到所需的結(jié)果。(這 
 * 句話是音譯傍睹,原意是能在眾多索引數(shù)中“撕開一個(gè)缺口”隔盛,為什么原文這么表達(dá)?下面會(huì)慢慢說(shuō)清楚拾稳。)它比HashMap去通過(guò)Integer索引 
 * 查找object對(duì)象時(shí)在內(nèi)存上更具效率,不僅因?yàn)樗苊饬擞脕?lái)查找的自動(dòng)“裝箱”的keys吮炕,并且它的數(shù)據(jù)結(jié)構(gòu)不依賴額外的對(duì)象去 
 * 各個(gè)映射中查找匹配。 
 *  
 * SparseArrays map integers to Objects.  Unlike a normal array of Objects, 
 * there can be gaps in the indices.  It is intended to be more memory efficient 
 * than using a HashMap to map Integers to Objects, both because it avoids 
 * auto-boxing keys and its data structure doesn't rely on an extra entry object 
 * for each mapping. 
 * 
 * 請(qǐng)注意熊赖,這個(gè)容器會(huì)保持它的映射關(guān)系在一個(gè)數(shù)組的數(shù)據(jù)結(jié)構(gòu)中来屠,通過(guò)二分檢索法驅(qū)查找key。(這里我們終于知道震鹉,為何這個(gè)工具類中俱笛, 
 * 提供的添加映射關(guān)系的操作中,key的類型必須是integer传趾。因?yàn)槎謾z索法迎膜,將從中間“切開”,integer的數(shù)據(jù)類型是實(shí)現(xiàn)這種檢索過(guò)程的保證浆兰。) 
 *  
 * 如果保存大量的數(shù)據(jù)磕仅,這種數(shù)據(jù)結(jié)構(gòu)是不適合的,換言之簸呈,SparseArray這個(gè)工具類并不應(yīng)該用于存儲(chǔ)大量的數(shù)據(jù)榕订。這種情況下,它的效率 
 * 通常比傳統(tǒng)的HashMap更低蜕便,因?yàn)樗牟檎曳椒ú⑶以黾雍鸵瞥僮鳎ㄈ我庖粋€(gè)操作)都需要在數(shù)組中插入和刪除(兩個(gè)步驟才能實(shí)現(xiàn))劫恒。 
 *  
 * 如果存儲(chǔ)的數(shù)據(jù)在幾百個(gè)以內(nèi),它們的性能差異并不明顯,低于50%两嘴。 
 *  
 * (OK丛楚,那么光看Android官方的介紹我們就有初步結(jié)論了,大量的數(shù)據(jù)我們相對(duì)SparseArray會(huì)優(yōu)先選擇HashMap憔辫,如果數(shù)據(jù)在幾百個(gè)這個(gè)數(shù)目趣些, 
 *  那么選擇它們?nèi)我庖粋€(gè)去實(shí)現(xiàn)區(qū)別不大,如果數(shù)量較少贰您,就選擇SparseArray去實(shí)現(xiàn)坏平。 其實(shí)如果我們理解了二分法,就很容易了SparseArray的 
 *  實(shí)現(xiàn)原理枉圃,以及SparseArray和HashMap它們之間的區(qū)別了功茴。) 
 *  
 * <p>Note that this container keeps its mappings in an array data structure, 
 * using a binary search to find keys.  The implementation is not intended to be appropriate for 
 * data structures 
 * that may contain large numbers of items.  It is generally slower than a traditional 
 * HashMap, since lookups require a binary search and adds and removes require inserting 
 * and deleting entries in the array.  For containers holding up to hundreds of items, 
 * the performance difference is not significant, less than 50%.</p> 
 * 
 *   
 * 為了提高性能庐冯,這個(gè)容器包含了一個(gè)實(shí)現(xiàn)最優(yōu)的方法:當(dāng)移除keys后為了立刻使它的數(shù)組緊密孽亲,它會(huì)“遺留”已經(jīng)被移除(標(biāo)記了要?jiǎng)h除)的條目(entry) 。 
 * 所被標(biāo)記的條目(entry)(還未被當(dāng)作垃圾回收掉前)可以被相同的key復(fù)用展父,也會(huì)在垃圾回收機(jī)制當(dāng)作所有要回收的條目的一員被回收返劲,從而使存儲(chǔ)的數(shù)組更緊密。 
 *  
 * (我們下面看源碼就會(huì)發(fā)現(xiàn)remove()方法其實(shí)是調(diào)用delete()方法的栖茉。印證了上面這句話所說(shuō)的這種優(yōu)化方法篮绿。 
 * 因?yàn)檫@樣,能在每次移除元素后一直保持?jǐn)?shù)組的數(shù)據(jù)結(jié)構(gòu)是緊密不松散的吕漂。) 
 *  
 * 垃圾回收的機(jī)制會(huì)在這些情況執(zhí)行:數(shù)組需要擴(kuò)充亲配,或者映射表的大小被恢復(fù),或者條目值被重新檢索后恢復(fù)的時(shí)候惶凝。 
 *   
 * <p>To help with performance, the container includes an optimization when removing 
 * keys: instead of compacting its array immediately, it leaves the removed entry marked 
 * as deleted.  The entry can then be re-used for the same key, or compacted later in 
 * a single garbage collection step of all removed entries.  This garbage collection will 
 * need to be performed at any time the array needs to be grown or the the map size or 
 * entry values are retrieved.</p> 
 * 
 * 當(dāng)調(diào)用keyAt(int)去獲取某個(gè)位置的key的鍵的值吼虎,或者調(diào)用valueAt(int)去獲取某個(gè)位置的值時(shí),可能是通過(guò)迭代容器中的元素 
 * 去實(shí)現(xiàn)的苍鲜。 
 * 
 * <p>It is possible to iterate over the items in this container using 
 * {@link #keyAt(int)} and {@link #valueAt(int)}. Iterating over the keys using 
 * <code>keyAt(int)</code> with ascending values of the index will return the 
 * keys in ascending order, or the values corresponding to the keys in ascending 
 * order in the case of <code>valueAt(int)<code>.</p> 
 */  
public class SparseArray<E> implements Cloneable {  
    //...  
}  

對(duì)比HashMap

  • 優(yōu)勢(shì)
    空間上 去除了hash值的存儲(chǔ)空間
    時(shí)間上 少了自動(dòng)裝箱的過(guò)程 效率提高
  • 劣勢(shì)
    不適合數(shù)據(jù)量很大的數(shù)據(jù) 因?yàn)椴捎玫亩植檎?strong>(O(logn)) 大數(shù)據(jù)下明顯效率低于hash查找(O(1))
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末思灰,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子混滔,更是在濱河造成了極大的恐慌洒疚,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,464評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件坯屿,死亡現(xiàn)場(chǎng)離奇詭異油湖,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)领跛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,033評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門乏德,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人隔节,你說(shuō)我怎么就攤上這事鹅经〖徘海” “怎么了?”我有些...
    開封第一講書人閱讀 169,078評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵瘾晃,是天一觀的道長(zhǎng)贷痪。 經(jīng)常有香客問(wèn)我,道長(zhǎng)蹦误,這世上最難降的妖魔是什么劫拢? 我笑而不...
    開封第一講書人閱讀 59,979評(píng)論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮强胰,結(jié)果婚禮上舱沧,老公的妹妹穿的比我還像新娘。我一直安慰自己偶洋,他們只是感情好熟吏,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,001評(píng)論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著玄窝,像睡著了一般牵寺。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上恩脂,一...
    開封第一講書人閱讀 52,584評(píng)論 1 312
  • 那天帽氓,我揣著相機(jī)與錄音,去河邊找鬼俩块。 笑死黎休,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的玉凯。 我是一名探鬼主播势腮,決...
    沈念sama閱讀 41,085評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼壮啊!你這毒婦竟也來(lái)了嫉鲸?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,023評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤歹啼,失蹤者是張志新(化名)和其女友劉穎玄渗,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體狸眼,經(jīng)...
    沈念sama閱讀 46,555評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡藤树,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,626評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了拓萌。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片岁钓。...
    茶點(diǎn)故事閱讀 40,769評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出屡限,到底是詐尸還是另有隱情品嚣,我是刑警寧澤,帶...
    沈念sama閱讀 36,439評(píng)論 5 351
  • 正文 年R本政府宣布钧大,位于F島的核電站翰撑,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏啊央。R本人自食惡果不足惜眶诈,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,115評(píng)論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望瓜饥。 院中可真熱鬧逝撬,春花似錦、人聲如沸乓土。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,601評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)帐我。三九已至坎炼,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間拦键,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,702評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工檩淋, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留芬为,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,191評(píng)論 3 378
  • 正文 我出身青樓蟀悦,卻偏偏與公主長(zhǎng)得像媚朦,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子日戈,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,781評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容

  • 在一個(gè)方法內(nèi)部定義的變量都存儲(chǔ)在棧中询张,當(dāng)這個(gè)函數(shù)運(yùn)行結(jié)束后,其對(duì)應(yīng)的棧就會(huì)被回收浙炼,此時(shí)份氧,在其方法體中定義的變量將不...
    Y了個(gè)J閱讀 4,420評(píng)論 1 14
  • 一些概念 數(shù)據(jù)結(jié)構(gòu)就是研究數(shù)據(jù)的邏輯結(jié)構(gòu)和物理結(jié)構(gòu)以及它們之間相互關(guān)系,并對(duì)這種結(jié)構(gòu)定義相應(yīng)的運(yùn)算弯屈,而且確保經(jīng)過(guò)這...
    Winterfell_Z閱讀 5,854評(píng)論 0 13
  • 前言 這次我和大家一起學(xué)習(xí)HashMap蜗帜,HashMap我們?cè)诠ぷ髦薪?jīng)常會(huì)使用,而且面試中也很頻繁會(huì)問(wèn)到资厉,因?yàn)樗?..
    liangzzz閱讀 8,004評(píng)論 7 102
  • Java8張圖 11厅缺、字符串不變性 12、equals()方法、hashCode()方法的區(qū)別 13湘捎、...
    Miley_MOJIE閱讀 3,709評(píng)論 0 11
  • 愛情窥妇,最好的狀態(tài)是這樣的 微信公眾號(hào): 小女子要走心 來(lái)過(guò)且叁,便未曾離開。 我一直在秩伞,等你回來(lái)逞带。 歌曲推薦:期待愛 ...
    小女子不走心閱讀 169評(píng)論 0 0