以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 類型,優先考慮此方法。
資料結構和hashMap類似,採用<key,value>,透過key的 hash值對應到包含<key,value>的vlaue值,但是資料是連續不間斷的,實現內部資料儲存最佳化。
核心架構和SparseArray類似,都採用binary search,針對key從小排至大。
- 在 SparseArray同樣情況是int或long或boolean下,在items量超過100後,效能會減少50%。
- 在insert\/delete時,效率雖然不夠快。但別擔心items量超過100後,記憶體佔存量還是遠低於HashMap。
- 在 SparseArray同樣情況是int或long或boolean下,在items量超過100後,效能會減少50%。
ref: