更適合Android的集合 SparseArray/ArrayMap/ArraySet

Android中有一套對於經常使用的集合本身的實現; 主要是減小內存消耗(客戶端對於數據量要求並不高可是對於內存要求儘量低);java

如下提到的三個集合應用場景都是數組

  • 千級如下適用, 大量數據不適用(二分查找缺陷), 由於Android基本上不多涉及到大量數據因此能夠普遍應用;
  • 內存優化
  • 所有都支持索引(這是Java中的Map和Set集合不具有的)

SparseArray

該集合類型能夠避免自動裝箱減小內存的消耗; 對於大量的數據性能不如Java提供的Map集合(二分查詢的缺陷);app

集合內部維護了兩個數組; 一個是對應key另一個對應value(這裏也就產生了有value可是沒有對應key的狀況能夠出現, 後面解釋如何產生這種狀況)函數

  • SparseArray
  • SparseIntArray
  • SparseLongArray
  • SparseBooleanArray

SparseArray支持泛型(自定義Value類型)性能

SparseIntArray這些就是避免自動裝箱的集合, 只支持固定的基本類型; 可是他們都只支持key的類型是int, 而且不支持迭代器遍歷;優化

SparseArray的函數spa

SparseArray<E> clone() // 查詢 E get(int key) E get(int key, E valueIfKeyNotFound) // 若是查詢不到返回-1 int indexOfKey(int key) int indexOfValue(E value) // 若是查詢不到返回默認值 E valueAt(int index) int keyAt(int index) // 增長 void append(int key, E value) void put(int key, E value) void setValueAt(int index, E value) // 刪除 void delete(int key) void remove(int key) void removeAt(int index) void removeAtRange(int index, int size) void clear() int size() String toString() 複製代碼

SparseArray有一些相同函數, 例如deleteremove; 兩個函數功能徹底相同;code

setValueAt這個函數能夠不添加key向集合中添加value, 可是最終並不會算在toString之中(而且不會影響size); get()也沒法獲取到value;索引

可是能夠經過valueAt()函數獲取到value值; 這種操做只有SparseArray能夠, 相似SparseIntArray都不支持setValueAt()函數;內存

ArrayMap

該集合類型和SparseArray一樣基於二分查詢, 對於千之內的數據量Google推薦使用, 大量數據一樣性能不佳;

而且該集合類型不能解決自動裝箱問題, 可是也能減小內存消耗;

相比SparseArray就是支持自定義Key的類型;

增長

V put(K key, V value) void putAll(ArrayMap<? extends K, ? extends V> array) void putAll(Map<? extends K, ? extends V> map) V setValueAt(int index, V value) 複製代碼

刪除

V remove(Object key) boolean removeAll(Collection<?> collection) V removeAt(int index) void clear() 複製代碼

查詢

V get(Object key) K keyAt(int index) V valueAt(int index) int indexOfKey(Object key) boolean isEmpty() 複製代碼

沒有indexOfValue()

遍歷

Collection<V> values() Set<K> keySet() Set<Entry<K, V>> entrySet() 複製代碼

其餘

boolean containsAll(Collection<?> collection) boolean containsKey(Object key) boolean containsValue(Object value) void ensureCapacity(int minimumCapacity) boolean equals(Object object) int hashCode() boolean retainAll(Collection<?> collection) int size() String toString() 複製代碼

ArraySet

該集合和ArrayMap相似, 只不過不是映射關係而已; ArraySet支持迭代器;

相關文章
相關標籤/搜索