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