概要
概括的说,SparseArray<E>是用于在Android平台上替代HashMap的数据结构,更具体的说,
是用于替代key为int类型,value为Object类型的HashMap。
和ArrayMap类似,它的实现相比于HashMap更加节省空间,而且由于key指定为int类型,也可以节省int-Integer的装箱拆箱操作带来的性能消耗。
它仅仅实现了implements Cloneable接口,所以使用时不能用Map作为声明类型来使用。
它也是线程不安全的,允许value为null。
从原理上说,
它的内部实现也是基于两个数组。
一个int[]数组mKeys,用于保存每个item的key,key本身就是int类型,所以可以理解hashCode值就是key的值.
一个Object[]数组mValues,保存value。容量和key数组的一样。
类似ArrayMap,
它扩容的更合适,扩容时只需要数组拷贝工作,不需要重建哈希表。
比传统的HashMap时间效率低。
因为其会对key从小到大排序,使用二分法查询key对应在数组中的下标。
在添加、删除、查找数据的时候都是先使用二分查找法得到相应的index,然后通过index来进行添加、查找、删除等操作。
另外,SparseArray为了提升性能,在删除操作时做了一些优化:
当删除一个元素时,并不是立即从value数组中删除它,并压缩数组,
而是将其在value数组中标记为已删除。这样当存储相同的key的value时,可以重用这个空间。
如果该空间没有被重用,随后将在合适的时机里执行gc(垃圾收集)操作,将数组压缩,以免浪费空间
。
网友评论