Map和SparseArray的PK替蔬。

Map

Map這是Java語言自帶的一種容器
使用起來比較簡單,很多數(shù)據(jù)結(jié)構(gòu)中用的相當(dāng)頻繁屎暇,
眾所周知承桥,Map是一個(gè)接口。我們看下關(guān)于
A根悼、Map的集合實(shí)現(xiàn)凶异,鍵值對(duì)的一一對(duì)象存儲(chǔ)關(guān)系。
** B挤巡、Map集合中不能包含相同的key(鍵值)--此處是通過Key的散列碼區(qū)分唠帝。**

Map相關(guān)的方法:
clear():清除Map集合的所有數(shù)據(jù)。
containKey(Object var1):是否包含鍵玄柏。返回的數(shù)boolean數(shù)據(jù)襟衰。
containValue(Object var1):是否包含某個(gè)值。
isEmpty():是否為空粪摘。
put(K var1, V var2):添加鍵值對(duì)瀑晒。
putAll(Map<? extends K, ? extends V> var1);添加一個(gè)Map集合(但是兩個(gè)集合的鍵值對(duì)的對(duì)象是同類的)。
remove(Object var1):刪除某個(gè)鍵值對(duì)徘意。參數(shù)是key值苔悦。
size():Map集合的大小。
Map集合的遍歷方式:

1椎咧、迭代器遍歷

Iterator iterator = map.entrySet().iterator();
  while ( iterator.hasNext() ) {
      Map.Entry entry = (Map.Entry) iterator.next();
      Object valueObject =  entry.getValue();
      Object keyObject =  entry.getKey();
  }![image](http://note.youdao.com/favicon.ico)

2玖详、foreach遍歷

for (Map.Entry entry : map.entrySet()) {
     Object keyObject = entry.getKey();
     Object valueObject = entry.getValue();
 }

3、單獨(dú)取值遍歷

Map<Object, Object> map = new HashMap();
for (Object object : map.keySet()) {
    //獲取到的是Key.
}
for(Object object : map.values()){
    //獲取的是values.
}
Map實(shí)現(xiàn)類的相關(guān)介紹
(1)HashMap是一個(gè)最常用的Map勤讽,它根據(jù)鍵的hashCode值存儲(chǔ)數(shù)據(jù)蟋座,根據(jù)鍵可以直接獲取它的值,具有很快的訪問速度脚牍。
     A向臀、HashMap最多只允許一條記錄的鍵為null,允許多條記錄的值為null诸狭。
     B券膀、HashMap不支持線程的同步,即任一時(shí)刻可以有多個(gè)線程同時(shí)寫HashMap驯遇,可能會(huì)導(dǎo)致數(shù)據(jù)的不一致芹彬。
     C、如果需要同步叉庐,可以用Collections.synchronizedMap(HashMap map)方法使HashMap具有同步的能力舒帮。
(2)Hashtable與HashMap類似,不同的是:
    A、它不允許記錄的鍵或者值為空会前;
    B好乐、它支持線程的同步,即任一時(shí)刻只有一個(gè)線程能寫Hashtable瓦宜,然而蔚万,這也導(dǎo)致了Hashtable在寫入時(shí)會(huì)比較慢。
(3)LinkedHashMap保存了記錄的插入順序临庇,在用Iteraor遍歷LinkedHashMap時(shí)反璃,先得到的記錄肯定是先插入的。 在遍歷的時(shí)候會(huì)比HashMa慢假夺。
(4)TreeMap能夠把它保存的記錄根據(jù)鍵排序淮蜈,默認(rèn)是按升序排序,也可以指定排序的比較器已卷。當(dāng)用Iteraor遍歷TreeMap時(shí)梧田,得到的記錄是排過的。

SparseArray

SparseArray是Android里了替代hashMap這樣的數(shù)據(jù)結(jié)構(gòu)的產(chǎn)生的 目的是為了提高內(nèi)存的使用效率侧蘸。(SparseArray采用的是折半查找)

SparseArray相關(guān)特點(diǎn)
在google的官方文檔中也提及到了內(nèi)存效率高些裁眯。主要是有以下兩點(diǎn)吧(與HashMap相比)
A、不需要進(jìn)行對(duì)象轉(zhuǎn)化讳癌。(HashMap的鍵值都是對(duì)象穿稳。SparseArray是常見的數(shù)據(jù)類型)。
B晌坤、數(shù)據(jù)結(jié)構(gòu)的差異逢艘,與hashMap的散列碼以及哈希值不一樣的在于,底層的是用過一個(gè)數(shù)組實(shí)現(xiàn)的骤菠。通過折半對(duì)數(shù)組進(jìn)行一系列的操作它改,所以其實(shí)在查詢上可能還會(huì)比HashMap慢,但是在添加和刪除操作中娩怎,會(huì)提高百分之50的內(nèi)存效率搔课。
C胰柑、大量的數(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)。
SparseArray相關(guān)的方法

每個(gè)數(shù)據(jù)結(jié)構(gòu)踩官,無非就是增刪改查

  • clone() 克隆一個(gè)與當(dāng)前SparseArray不是同一個(gè)存儲(chǔ)地址的SparseAarry相當(dāng)于 new 一個(gè)當(dāng)前的SparseArray.
    1. append(int key, E value) 添加數(shù)據(jù)的時(shí)候却桶,相當(dāng)于StringBuilder的添加方法,在最后一位添加。

    2. put(int key, E value)
      這個(gè)就和HashMap差不多吧颖系,如果當(dāng)前有key的話就替代value之前已經(jīng)有的嗅剖。
      其實(shí)我后來研究了一下,這兩個(gè)方法本質(zhì)是一樣的 沒有什么區(qū)別嘁扼。都是一樣的功能如果只是單純看文檔說明就是上面我說的意思信粮。

      我們來看看源碼吧

/**
     * Puts a key/value pair into the array, optimizing for the case where
     * the key is greater than all existing keys in the array.
     */
    public void append(int key, E value) {
        if (mSize != 0 && key <= mKeys[mSize - 1]) {
            put(key, value);
            return;
        }

        if (mGarbage && mSize >= mKeys.length) {
            gc();
        }

        mKeys = GrowingArrayUtils.append(mKeys, mSize, key);
        mValues = GrowingArrayUtils.append(mValues, mSize, value);
        mSize++;
    }

append方法還是會(huì)調(diào)put方法的。

    • delete(int key)
    • remove(int key)
      上面的方法都是通過刪除的方式趁啸,其實(shí)是一樣的强缘。
    • removeAt(int index) 這就是通過索引值刪除這數(shù)據(jù)。
    • clear() 清空所有的Key-Values的數(shù)據(jù).

    remove()源碼如下:

/**
     * Alias for {@link #delete(int)}.
     */
    public void remove(int key) {
        delete(key);
    }
    • **setValueAt(int index, E value) ** 修改對(duì)應(yīng)該的index去修改對(duì)應(yīng)的Value
    • 還有就是put以及append方法了不傅。這也是修改數(shù)據(jù)的方法旅掂。
    • indexOfKey(int key)indexOfValue(E value) 查找索引值(角標(biāo))。
    • keyAt(int index)valueAt(int index)就是通過索引值查找對(duì)于的key和Value.
  • gc()

    • 這是SparseArray自己構(gòu)建的回收機(jī)制访娶。

SparseArray的遍歷

for (int x = 0; x < sparseArray.size();x ++){
            int key = sparseArray.keyAt(x);
            String values = sparseArray.valueAt(x);
  }

可以只取key或者Values. 看個(gè)人需求商虐。

以上有什么有問題的地方,多多擔(dān)待

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末崖疤,一起剝皮案震驚了整個(gè)濱河市成榜,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌羹奉,老刑警劉巖笔横,帶你破解...
    沈念sama閱讀 221,273評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異沦偎,居然都是意外死亡疫向,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門豪嚎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來搔驼,“玉大人,你說我怎么就攤上這事侈询∩嗾牵” “怎么了?”我有些...
    開封第一講書人閱讀 167,709評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵扔字,是天一觀的道長囊嘉。 經(jīng)常有香客問我,道長革为,這世上最難降的妖魔是什么扭粱? 我笑而不...
    開封第一講書人閱讀 59,520評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮震檩,結(jié)果婚禮上琢蛤,老公的妹妹穿的比我還像新娘蜓堕。我一直安慰自己,他們只是感情好博其,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,515評(píng)論 6 397
  • 文/花漫 我一把揭開白布套才。 她就那樣靜靜地躺著,像睡著了一般慕淡。 火紅的嫁衣襯著肌膚如雪霜旧。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,158評(píng)論 1 308
  • 那天儡率,我揣著相機(jī)與錄音挂据,去河邊找鬼。 笑死儿普,一個(gè)胖子當(dāng)著我的面吹牛崎逃,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播眉孩,決...
    沈念sama閱讀 40,755評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼个绍,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了浪汪?” 一聲冷哼從身側(cè)響起巴柿,我...
    開封第一講書人閱讀 39,660評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎死遭,沒想到半個(gè)月后广恢,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,203評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡呀潭,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,287評(píng)論 3 340
  • 正文 我和宋清朗相戀三年钉迷,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片钠署。...
    茶點(diǎn)故事閱讀 40,427評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡糠聪,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出谐鼎,到底是詐尸還是另有隱情舰蟆,我是刑警寧澤,帶...
    沈念sama閱讀 36,122評(píng)論 5 349
  • 正文 年R本政府宣布狸棍,位于F島的核電站身害,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏隔缀。R本人自食惡果不足惜题造,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,801評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望猾瘸。 院中可真熱鬧,春花似錦、人聲如沸牵触。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,272評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽揽思。三九已至袜腥,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間钉汗,已是汗流浹背羹令。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評(píng)論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留损痰,地道東北人福侈。 一個(gè)月前我還...
    沈念sama閱讀 48,808評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像卢未,于是被迫代替她去往敵國和親肪凛。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,440評(píng)論 2 359

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

  • 轉(zhuǎn)載自:https://halfrost.com/go_map_chapter_one/ https://half...
    HuJay閱讀 6,154評(píng)論 1 5
  • 分析常用集合的底層的原理:ArrayList辽社、Vector伟墙、LinckedList、HashMap滴铅、HashSet...
    仕明同學(xué)閱讀 2,202評(píng)論 1 13
  • 我們習(xí)慣了用我們的經(jīng)歷去判斷一個(gè)人戳葵,正如我早上發(fā)了一條說說一樣,說自己英語五級(jí)汉匙,然而這個(gè)所謂的五級(jí)并不是四六級(jí)里面...
    FiftytwoHzwhale閱讀 149評(píng)論 0 0
  • 好想 觸碰著你的指尖 感受 你的心動(dòng) 讓愛傾涌 好想 凝視著你的眉彎 望穿 你的心靈 讓心交融 好想 靜守著你的身...
    古樓聽雨憶流年閱讀 208評(píng)論 0 1
  • 十年前 你還是個(gè)蹦蹦跳跳的小屁孩 每天都會(huì)看“動(dòng)畫夢工廠” 還記得那個(gè)聰明的一休 每天都會(huì)忍不住要看《火影忍者》 ...
    Joe_太君閱讀 255評(píng)論 1 1