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

劉強東發表於2018-05-30

Android中有一套對於常用的集合自己的實現; 主要是減少記憶體消耗(客戶端對於資料量要求並不高但是對於記憶體要求儘可能低);

以下提到的三個集合應用場景都是

  • 千級以下適用, 大量資料不適用(二分查詢缺陷), 因為Android基本上很少涉及到大量資料所以可以廣泛應用;
  • 記憶體優化
  • 全部都支援索引(這是Java中的Map和Set集合不具備的)

SparseArray

該集合型別可以避免自動裝箱減少記憶體的消耗; 對於大量的資料效能不如Java提供的Map集合(二分查詢的缺陷);

集合內部維護了兩個陣列; 一個是對應key另外一個對應value(這裡也就產生了有value但是沒有對應key的情況可以出現, 後面解釋如何產生這種情況)

  • SparseArray
  • SparseIntArray
  • SparseLongArray
  • SparseBooleanArray

SparseArray支援泛型(自定義Value型別)

SparseIntArray這些就是避免自動裝箱的集合, 只支援固定的基本型別; 但是他們都只支援key的型別是int, 並且不支援迭代器遍歷;

SparseArray的函式



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; 兩個函式功能完全相同;

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支援迭代器;

相關文章