Android arraymap可以重复
2023-01-10阅读(162)
问:Android开发中ArrayMap与HashMap有哪些不同
- 答:常用的集合类有一下几种:
List结构的集合类:ArrayList类,LinkedList类,Vector类,Stack类
Map结构的集合类:HashMap类,Hashtable类
Set结构的集合类:HashSet类,TreeSet类
Queue结构的集合:Queue接口
HashMap和Hashtable的区别:
HashMap和Hashtable都是java的集合类,都可以用来存放java对象,这是他们的相同点
以下是他们的区别:
1.历史原因:
Hashtable是基于陈旧的Dictionary类的,HashMap是java 1.2引进的Map接口的一个现实。
2.同步性:
Hashtable是同步的,这个类中的一些方法保证了Hashtable中的对象是线程安全的,而HashMap则是异步的,因此HashMap中的对象并不是线程安全的,因为同步的要求会影响执行的效率,所以如果你不需要线程安全的结合那么使用HashMap是一个很好的选择,这样可以避免由于同步带来的不必要的性能开销,从而提高效率,我们一般所编写的程序都是异步的,但如果是服务器端的代码除外。
3.值:
HashMap可以让你将空值作为一个表的条目的key或value
Hashtable是不能放入空值(null)的
问:ArrayMap和SparseArray
- 答:ArrayMap是android特有的api,主要是用于提高内存效率。他比传统的hashmap要慢,所以不适合大数据的存储,因为添加和查找的时候用二分查找法寻找,并且不是线程安全的.
主要是由2个数组mArray和mHashes来存储,其中mArray是用来存key-value的,mHashes是用来存key的value的,整体put方法的逻辑是这样(下面的图我是粘贴的,但是总结的很好):
mSize是ArrayMap中元素的个数,每次插入的时候都会计算这个size,扩大一次就是扩大2倍。
SparseArray是android上用来替代key是int而value是object的hashmap。更加节省空间,也是线程不安全的。原理也是2个数组,mKeys是int类型的数组,存储key的,mValues类型是object的。在需要节省空间的时候可以使用,一般在1000以内可以,超过了之后时间消耗会翻倍。
put方法逻辑:首先利用二分查找法找到待插入key的index,如果index>0说明这个key存在,直接覆盖value,如果<0,先取反,找到应该插入的位置,如果i没有越界,且对应位置是已删除的标记,,则复用这个空间。如果需要gc且需要扩容,先gc再扩容,然后再插入。
问:ArrayMap,SparseArray,HashMap的区别
- 答:我们先看下ArrayMap的源码说明部分:
第一句就说了,ArrayMap是一个比HashMap内存优化更高效的键值对
ArrayMap维持了一个数组才承载map, 一个int[]承载hash值,一个Object[]才承载key/value
这样就避免了为每个Entry创建一个额外的对象,也尝试更加积极的控制size的增长(增长到极限之后,只需要将这名Entry复制到一个新数组里,不用重新创建hashMap)
ArrayMap并不适用于装载大量的数据条目,因为查找需要二分法检索,添加和删除需要插入以及删除数组中的项,它比HashMap的效率要低,如果装载几百条数据,ArrayMap效率并不显著,低于50%
ArrayMap是用来更好的内存使用的,不像其他大多数Java容器,当item被移除时,它会减少数组大小。
总结一下ArrayMap的特点:
1.ArrayMap是Android特有的api,用在移动端,所以它主要是提高内存效率。
2.ArrayMap比传统的HashMap慢,所以ArrayMap不适合包含大数据的处理,因为添加和删除元素的时候需要使用二分搜索来查找元素。
3.ArrayMap会在remove item的时候收缩数组。
4.ArrayMap不是线程安全的。
SparseArray 稀疏数组应用场景是相对稀少的数据,一般是几百以内的数据性能相对HashMap要好,大概提升0-50%的性能。SparseArray是用Integer作为键映射对象。
1 在item数量在百以下时,建议使用ArrayMap 和SparseArray代替HashMap,来优化内存。
2 SparseArray的key是Int
Android arraymap可以重复
下载Doc文档