Map和SparseArray的PK。

Map

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

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

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

SparseArray

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

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

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

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

    2. put(int key, E value)
      這個就和HashMap差不多吧,如果當(dāng)前有key的話就替代value之前已經(jīng)有的。
      其實我后來研究了一下,這兩個方法本質(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方法還是會調(diào)put方法的。

    • delete(int key)
    • remove(int key)
      上面的方法都是通過刪除的方式,其實是一樣的。
    • 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) ** 修改對應(yīng)該的index去修改對應(yīng)的Value
    • 還有就是put以及append方法了。這也是修改數(shù)據(jù)的方法。
    • indexOfKey(int key)indexOfValue(E value) 查找索引值(角標(biāo))。
    • keyAt(int index)valueAt(int index)就是通過索引值查找對于的key和Value.
  • gc()

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

SparseArray的遍歷

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

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

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

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

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

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

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