更适合Android的集合 SparseArray/ArrayMap/ArraySet
16lz
2021-01-25
Android中有一套对于常用的集合自己的实现; 主要是减少内存消耗(客户端对于数据量要求并不高但是对于内存要求尽可能低);
以下提到的三个集合应用场景都是
- 千级以下适用, 大量数据不适用(二分查找缺陷), 因为Android基本上很少涉及到大量数据所以可以广泛应用;
- 内存优化
- 全部都支持索引(这是Java中的Map和Set集合不具备的)
SparseArray
该集合类型可以避免自动装箱减少内存的消耗; 对于大量的数据性能不如Java提供的Map集合(二分查询的缺陷);
集合内部维护了两个数组; 一个是对应key另外一个对应value(这里也就产生了有value但是没有对应key的情况可以出现, 后面解释如何产生这种情况)
- SparseArray
- SparseIntArray
- SparseLongArray
- SparseBooleanArray
SparseArray支持泛型(自定义Value类型)
SparseIntArray这些就是避免自动装箱的集合, 只支持固定的基本类型; 但是他们都只支持key的类型是int, 并且不支持迭代器遍历;
SparseArray的函数
SparseArrayclone()// 查询Eget(int key)Eget(int key, E valueIfKeyNotFound)// 如果查询不到返回-1intindexOfKey(int key)intindexOfValue(E value)// 如果查询不到返回默认值EvalueAt(int index)intkeyAt(int index)// 增加voidappend(int key, E value)voidput(int key, E value)voidsetValueAt(int index, E value)// 删除voiddelete(int key)voidremove(int key)voidremoveAt(int index)voidremoveAtRange(int index, int size)voidclear() intsize()StringtoString() 复制代码
SparseArray有一些相同函数, 例如delete
和remove
; 两个函数功能完全相同;
setValueAt
这个函数可以不添加key向集合中添加value, 但是最终并不会算在toString
之中(并且不会影响size); get()
也无法获取到value;
但是可以通过valueAt()
函数获取到value值; 这种操作只有SparseArray可以, 类似SparseIntArray都不支持setValueAt()
函数;
ArrayMap
该集合类型和SparseArray同样基于二分查询, 对于千以内的数据量Google推荐使用, 大量数据同样性能不佳;
并且该集合类型不能解决自动装箱问题, 但是也能减少内存消耗;
相比SparseArray就是支持自定义Key的类型;
增加
Vput(K key, V value)voidputAll(ArrayMap<? extends K, ? extends V> array)voidputAll(Map<? extends K, ? extends V> map)VsetValueAt(int index, V value)复制代码
删除
Vremove(Object key)booleanremoveAll(Collection<?> collection)VremoveAt(int index)voidclear()复制代码
查询
Vget(Object key)KkeyAt(int index)VvalueAt(int index)intindexOfKey(Object key)booleanisEmpty()复制代码
没有
indexOfValue()
遍历
Collectionvalues()SetkeySet()Set>entrySet() 复制代码
其他
booleancontainsAll(Collection<?> collection)booleancontainsKey(Object key)booleancontainsValue(Object value)voidensureCapacity(int minimumCapacity)booleanequals(Object object)inthashCode()booleanretainAll(Collection<?> collection)intsize()StringtoString()复制代码
ArraySet
该集合和ArrayMap类似, 只不过不是映射关系而已; ArraySet支持迭代器;
更多相关文章
- 没有一行代码,「2020 新冠肺炎记忆」这个项目却登上了 GitHub 中
- Android实现动态高斯模糊效果示例代码
- Android(安卓)WebView填坑记录
- power_supply子系统笔记
- 史上最详细创建 Android(安卓)AIDL 远程服务步骤
- [置顶] Android与H5交互(混合开发)
- Android中的状态机(续)
- Android(安卓)上传图片到 Asp.Net 服务器的问题
- Android(安卓)Studio混淆相关总结