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有一些相同函式, 例如delete
和remove
; 兩個函式功能完全相同;
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支援迭代器;