Map和SparseArray的PK。

Map

Map這是Java語言自帶的一種容器
使用起來比較簡單,很多數據結構中用的相當頻繁,
眾所周知,Map是一個接口。我們看下關于
A、Map的集合實現,鍵值對的一一對象存儲關系。
** B、Map集合中不能包含相同的key(鍵值)--此處是通過Key的散列碼區分。**

Map相關的方法:
clear():清除Map集合的所有數據。
containKey(Object var1):是否包含鍵。返回的數boolean數據。
containValue(Object var1):是否包含某個值。
isEmpty():是否為空。
put(K var1, V var2):添加鍵值對。
putAll(Map<? extends K, ? extends V> var1);添加一個Map集合(但是兩個集合的鍵值對的對象是同類的)。
remove(Object var1):刪除某個鍵值對。參數是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、單獨取值遍歷

Map<Object, Object> map = new HashMap();
for (Object object : map.keySet()) {
    //獲取到的是Key.
}
for(Object object : map.values()){
    //獲取的是values.
}
Map實現類的相關介紹
(1)HashMap是一個最常用的Map,它根據鍵的hashCode值存儲數據,根據鍵可以直接獲取它的值,具有很快的訪問速度。
     A、HashMap最多只允許一條記錄的鍵為null,允許多條記錄的值為null。
     B、HashMap不支持線程的同步,即任一時刻可以有多個線程同時寫HashMap,可能會導致數據的不一致。
     C、如果需要同步,可以用Collections.synchronizedMap(HashMap map)方法使HashMap具有同步的能力。
(2)Hashtable與HashMap類似,不同的是:
    A、它不允許記錄的鍵或者值為空;
    B、它支持線程的同步,即任一時刻只有一個線程能寫Hashtable,然而,這也導致了Hashtable在寫入時會比較慢。
(3)LinkedHashMap保存了記錄的插入順序,在用Iteraor遍歷LinkedHashMap時,先得到的記錄肯定是先插入的。 在遍歷的時候會比HashMa慢。
(4)TreeMap能夠把它保存的記錄根據鍵排序,默認是按升序排序,也可以指定排序的比較器。當用Iteraor遍歷TreeMap時,得到的記錄是排過的。

SparseArray

SparseArray是Android里了替代hashMap這樣的數據結構的產生的 目的是為了提高內存的使用效率。(SparseArray采用的是折半查找)

SparseArray相關特點
在google的官方文檔中也提及到了內存效率高些。主要是有以下兩點吧(與HashMap相比)
A、不需要進行對象轉化。(HashMap的鍵值都是對象。SparseArray是常見的數據類型)。
B、數據結構的差異,與hashMap的散列碼以及哈希值不一樣的在于,底層的是用過一個數組實現的。通過折半對數組進行一系列的操作,所以其實在查詢上可能還會比HashMap慢,但是在添加和刪除操作中,會提高百分之50的內存效率。
C、大量的數據我們相對SparseArray會優先選擇HashMap,如果數據在幾百個這個數目, 那么選擇它們任意一個去實現區別不大,如果數量較少,就選擇SparseArray去實現。
SparseArray相關的方法

每個數據結構,無非就是增刪改查

  • clone() 克隆一個與當前SparseArray不是同一個存儲地址的SparseAarry相當于 new 一個當前的SparseArray.
    1. append(int key, E value) 添加數據的時候,相當于StringBuilder的添加方法,在最后一位添加。

    2. put(int key, E value)
      這個就和HashMap差不多吧,如果當前有key的話就替代value之前已經有的。
      其實我后來研究了一下,這兩個方法本質是一樣的 沒有什么區別。都是一樣的功能如果只是單純看文檔說明就是上面我說的意思。

      我們來看看源碼吧

/**
     * 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方法還是會調put方法的。

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

    remove()源碼如下:

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

    • 這是SparseArray自己構建的回收機制。

SparseArray的遍歷

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

可以只取key或者Values. 看個人需求。

以上有什么有問題的地方,多多擔待

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,333評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,491評論 3 416
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,263評論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,946評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,708評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,186評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,255評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,409評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,939評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,774評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,976評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,518評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,209評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,641評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,872評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,650評論 3 391
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,958評論 2 373

推薦閱讀更多精彩內容

  • 轉載自:https://halfrost.com/go_map_chapter_one/ https://half...
    HuJay閱讀 6,170評論 1 5
  • 分析常用集合的底層的原理:ArrayList、Vector、LinckedList、HashMap、HashSet...
    仕明同學閱讀 2,208評論 1 13
  • 我們習慣了用我們的經歷去判斷一個人,正如我早上發了一條說說一樣,說自己英語五級,然而這個所謂的五級并不是四六級里面...
    FiftytwoHzwhale閱讀 155評論 0 0
  • 好想 觸碰著你的指尖 感受 你的心動 讓愛傾涌 好想 凝視著你的眉彎 望穿 你的心靈 讓心交融 好想 靜守著你的身...
    古樓聽雨憶流年閱讀 211評論 0 1
  • 十年前 你還是個蹦蹦跳跳的小屁孩 每天都會看“動畫夢工廠” 還記得那個聰明的一休 每天都會忍不住要看《火影忍者》 ...
    Joe_太君閱讀 257評論 1 1