ArrayMap和sparseArray相较于HashMap的改进

当要存储大量数据时,hashMap需要不断扩容,需要不停的做hash运算,这样会极大的浪费内存空间,消耗性能。

SparseArray:

1.SparseArray比HashMap更加节省空间,在某些情况下,性能也比HashMap强。主要原因是其避免了key的自动装箱(int 转化为integer类型)。

2.它内部用两个数组来存储数据,一个存储key,一个存储value。而且为了进一步优化空间,它内部采用压缩数据的方式来表示稀疏数组的数据(数组空间实际使用率低,很多都是空的,造成空间浪费)。

3.它在put和get时,采用的是二分查找法。也就是在添加数据的时候,会采用二分查找法将新增的key和数组中的key比较,之后按从小到大的顺序排好。因此它里面的数据是按元素key大小,从小到大排列的。获取数据的时候也是采用二分查找法确定位置,获取数据的,因此比hashMap快的多。

4.put的时候按二分查找法,如果找到了相同的键,则覆盖原值。查找失败,则说明这是一个新的键,如果新键索引位指向待删除位(该数组不会真正删除数据,因为太耗时,要删除的元素会标记为删除,因此该数组是稀疏数组,有效值不是紧挨着有效值的。),则将新值存进去,复用该待删除位。如果新键索引位已经被其他键占用,发生冲突,则通过挪动数组来解决冲突

ArrayMap:

它采用两个一维数组,mHashes储存key的hashcode值,mArray依次储存key和value。mArray的大小是mHashes的两倍。

put();

1.根据key求出hash值,在用二分查找法找到对应下标index。

2.如果index>=0,找到了匹配元素,根据index,覆盖原值。

3.如果index<0,找不到匹配元素,则将下标取反,之后判断是否需要扩容,是否需要挪动数组,之后存入新值。

4.key和value可以为null,没有最大扩容限制,直到出现oom。

和HashMap相比:

优点:

1.比HashMap内存空间更优,因为比HashMap少一个实体类修饰(Entry)

2.扩容更加高效。因为ArrayMap,只需将数据复制到扩容后的新数组即可。

缺点:

1.在数据量大的时候,查询、插入、删除效率都不如HashMap,因为每次存取时,需要使用二分查找法,查找到对应的下标。

2.没有进行格式化,不便在安卓页面之间传递数据。

适用场景:

数据量小,建议百量级别,对内存空间要求高。

如果数据在千量级别以内:

1.如果key是int类型,则建议采用sparseArray,因为避免了key自动装箱,效率更高。如果是key是Long类型,可以使用LongSparseArray。

2.如果key是其他类型,则采用ArrayMap。

 

参考文章:https://juejin.im/post/5e5c5c52f265da575f4e7558#heading-23

 

 

你可能感兴趣的:(Java基础知识)