SparseArray结构比HashMap简单(SparseArray内部主要使用两个一维数组来保存数据,一个用来存key,一个用来存value)不需要额外的额外的数据结构(主要是针对HashMap中的HashMapEntry而言的)
检索:
SparseArray是使用折半查找(binarySearch)来进行检索的,
当SparseArray中存在需要检索的下标时,SparseArray的性能略胜一筹(表1)。
但是当检索的下标比较离散时,SparseArray需要使用多次二分检索,性能显然比hash检索方式要慢一些了(表2),但是按照官方文档的说法性能差异不是很大,不超过50%
所以 如果SparseArray的数据非常多, 可能就会慢一些
但是个人认为, 只要避免一个SparseArray所有地方都使用就可以比较检索稍慢的问题, 所以很适合使用在增强的ViewHolder中, 因为一个View中都set了一个SparseArray
删除
效率差不多
插入:
在正序插入数据时候,SparseArray比HashMap要快一些;HashMap不管是倒序还是正序开销几乎是一样的;但是SparseArray的倒序插入要比正序插入要慢10倍以上,这时为什么呢?我们再看下面一段代码:
内存占用:
可见使用 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