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

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

猜你喜欢

转载自juejin.im/post/5b0e842af265da08f76cced5