關於Android中 SparseArray和HashMap的討論筆記

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:

  • Allocation-free
  • No boxing

Drawbacks:

  • Generally slower, not indicated for large collections
  • They won't work in non-android project

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

相關文章
相關標籤/搜索