以Memory角度最佳化 -

HashMap and SparseArray and ArrayMap

先說結論

key是int boolean long類型時,可以優先考慮 SparseArray 。

當key不在上述類型時,可以使用 ArrayMap。(ex String,....)

HashMap,當你不了解上面兩個的用法時,當然就選這個。

HashMap - 最不推薦優先考慮。

  • 佔記憶體空間。

    • 佔內部記憶體高(在宣告 HashMap物件後,系統便會指定1個預設為array[16]的空間給它,即使裡面的value是空的),易記憶體資源浪費。

        • 若超過此容量,由Java API source code得知,hashmap會以2倍的空間擴大。

        int newCapacity = oldCapacity * 2;

  • 在insert \/ search \/ delete (key,value)時,效率慢,若是在data量很大時,更明顯【 平均花費時間O(n)】。

  • 在資料結構上,若遇到多個key的hash值相同,便會採用Linklist Address方法。對相同key值的 linklist 作循序搜尋 【 平均花費時間O(n)】 ,並執行 insert \/ search \/ delete (value)。

  • 所以在大量data需要在Hashmap作put (value)時,則需要大量的hash運算再重複上述動作。

  • 在實作時,會牽涉到Auto Boxing,所以慢!慢!慢!。<int自動轉為Integer類別>

    SparseArray - 降低search performance【 平均花費時間O(logn)】,memory 空間也相對hashmap減少。

  • 相對 HashMap不佔內部記憶體空間,此容器透過稀疏矩陣採用對內部資料記進行資料壓縮。

  • 核心採用binary search【 平均花費時間O(logn)】,insert\/delete\/added(value)效率快。

  • 沒有Auto Boxing問題(最主要節省 memory 空間因素)。

    • int

      • 用SparseArray<Object> array = new SparseArray<>(); 取代 HashMap<Integer, Object> map = new HashMap<>();
    • boolean

      • 用 SparseBooleanArray <Object> array = new SparseBooleanArray <>(); 取代 HashMap<Boolean, Object> map = new HashMap<>();
    • long

      • 用SparseLongArray <Object> array = new SparseLongArray <>(); 取代 HashMap<Long, Object> map = new HashMap<>();
  • ref:

ArrayMap - 和 SparseArray 差不多,當item架構是 Map 類型,優先考慮此方法。

results matching ""

    No results matching ""