SparseArray結構比HashMap簡單(SparseArray內部主要使用兩個一維數組來保存數據,一個用來存key,一個用來存value)不須要額外的額外的數據結構(主要是針對HashMap中的HashMapEntry而言的) html
檢索: android
SparseArray是使用折半查找(binarySearch)來進行檢索的, 數組
當SparseArray中存在須要檢索的下標時,SparseArray的性能略勝一籌(表1)。 數據結構
可是當檢索的下標比較離散時,SparseArray須要使用屢次二分檢索,性能顯然比hash檢索方式要慢一些了(表2),可是按照官方文檔的說法性能差別不是很大,不超過50% 性能
因此 若是SparseArray的數據很是多, 可能就會慢一些 this
可是我的認爲, 只要避免一個SparseArray全部地方都使用就能夠比較檢索稍慢的問題, 因此很適合使用在加強的ViewHolder中, 由於一個View中都set了一個SparseArray spa
刪除
效率差很少 .net
插入: code
在正序插入數據時候,SparseArray比HashMap要快一些;HashMap無論是倒序仍是正序開銷幾乎是同樣的;可是SparseArray的倒序插入要比正序插入要慢10倍以上,這時爲何呢?咱們再看下面一段代碼: orm
內存佔用:
可見使用 SparseArray 的確比 HashMap 節省內存,大概節省 35%左右的內存。
Sparse arrays can be used to replace hash maps when the key is a primitive type. There are some variants for different key/value type even though not all them are publicly available.
Benefits are:
Drawbacks:
HashMap can be replaced by the followings:
SparseArray <Integer,Object> SparseBooleanArray <Integer, Boolean> SparseIntArray <Integer, Integer> SparseLongArray <Integer, Long> LongSparseArray <Long, Object> LongSparseLongArray <Long, Long> //this is not a public class //but can be copied from Android source code
In terms of memory here is an example of SparseIntArray vs HashMap for 1000 elements
SparseIntArray:
class SparseIntArray { int[] keys; int[] values; int size; }
Class = 12 + 3 * 4 = 24 bytes
Array = 20 + 1000 * 4 = 4024 bytes
Total = 8,072 bytes
HashMap:
class HashMap<K, V> { Entry<K, V>[] table; Entry<K, V> forNull; int size; int modCount; int threshold; Set<K> keys Set<Entry<K, V>> entries; Collection<V> values; }
Class = 12 + 8 * 4 = 48 bytes
Entry = 32 + 16 + 16 = 64 bytes
Array = 20 + 1000 * 64 = 64024 bytes
Total = 64,136 bytes]
參考:
http://android-performance.com/android/2014/02/10/android-sparsearray-vs-hashmap.html
http://blog.csdn.net/zimo2013/article/details/39692245
http://stackoverflow.com/questions/25560629/sparsearray-vs-hashmap