首页 > 其他分享 >Android创造的ArrayMap和SparseArray

Android创造的ArrayMap和SparseArray

时间:2023-08-20 15:33:31浏览次数:25  
标签:hash key ArrayMap 查找 数组 SparseArray Android

ArrayMap和SparseArray,都是采取时间换取空间的方式来提高手机App的运行效率。

1.在数据量小的时候一般认为1000以下,当你的key为int的时候,使用 SparseArray 确实是一个很不错的选择,内存大概能节省30%,相比用HashMap,因为它key值不需要装箱,所以时间性能平均来看也优于HashMap,建议使用!

2.ArrayMap相对于SparseArray,特点就是key值类型不受限,任何情况下都可以取代HashMap,但是ArrayMap的内存节省并不明显,也就在10%左右,时间性能却是最差的,当然了,1000以内的数据量也无所谓了。

ArrayMap

  • 两个数组来存储;key的hash数据,key-value组成的数组;
  • 通过index来映射,2倍位置为key, 2倍位置+1 为value;
  • mHashes数据,是从小到大有序存储的
  • key是可以为null,null是hash值为0。不为空时,和mIdentityHashCode有关,仅可以在构造器中设置,默认为false
    hashcode = mIdentityHashCode ? System.identityHashCode(key) : key.hashCode()
  • 应用场景:
    1. item数量小于1000,尤其是插入数据和删除数据不频繁的情况。
    2. Map中包含子Map对
  • 初始化
    • 大小为0时,赋值空数组
    • 大小为4个,优先从mBaseCache(容量大小为8)找有效数组
    • 大小为8,优先从mTwiceBaseCache(容量大小为16)找有效数组
  • 扩容:调用下面两个方法时,可能会扩容
    public void ensureCapacity(int minimumCapacity)
    public V put(K key, V value)

    数组的移动System.arraycopy方法处理,如果容器大小增加了,则废弃的数组;废弃的数组,进行回收,如果存储容量大小为4或者8,会放入缓存中

  • 索引查找
    1. 进行二分查找,先查找到一个hash相等的位置;
    2. 根据查找的位置,若相等则返回查找位置
    3. 依据hash值相等,往后查找,若key相等,则返回,hash不等则结束;这时位置跟随hash相等而向后移动
    4. 依据hash值相等,往后查找,若key相等,则返回,hash不等则结束
    5. 没有找到,返回前面四步处理后的位置,并取非操作,返回负数值
  • 删除数据时,可能会进行容量缩减

 

SparseArray

  • 为稀疏数据准备的;
  • 也是两个数组,存储数组索引的key,存储数据value,通过相等索引来映射;
  • mKeys是从小到大有序存储的
  • key值只能为int 类型,value值为Object类型
  • 应用场景:数据量不大,最好在千级以内
  • 与ArrayMap的区别
    1. list集合
    2. 没有缓存机制
    3. 扩容大小不同;如果小于等于4,变为8,否则2倍扩容
    4. 排序以key排序(ArrayMap是以key的hash排序),数据只存储int类型的value值,key为稀疏数组的索引;
    5. 位置查找时,直接进行二分查找,找到即为插入位置
    6. 删除数据时,对容量大小不做处理

 

标签:hash,key,ArrayMap,查找,数组,SparseArray,Android
From: https://www.cnblogs.com/qionglouyuyu/p/17644062.html

相关文章

  • H5移动端禁止页面缩放(使用Android和IOS)
    <metaname="viewport"content="width=device-width,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no"/>标签说明:width:设置viewport的宽度,正整数/字符串device-widthheight:设置viewport的高度,正整数/字符串device-heightinitia......
  • JS判断是否是IOS或Android环境
    //通过判断浏览器的userAgentconstuserAgent=navigator.userAgent;constisiOS=!!userAgent.match(/\(i[^;]+;(U;)?CPU.+MacOSX/);constisAndroid=userAgent.indexOf('Android')>-1||userAgent.indexOf('Adr')>-1;//alert('是......
  • “金九银十”的秋招季,请收下这套互联网中大厂Android面试题大全(含答案解析)
    金九银十,每年9、10月份各大互联网公司都会周期性地发生人事变动,无论是刚进入社会的职场菜鸟,还是准备跳槽的老手,都想在这个时候获得新的工作,或迎来晋升涨薪的最佳机会。不同于往年的是今年的互联网寒冬好像更冷一点,形式更严峻了一些,不少公司都在裁员,可能在求职中有一大部分人经历了......
  • 收藏~Dropbox 是如何解决 Android App 的内存泄漏问题的?
    当应用程序为对象分配内存,而对象不再被使用时却没有释放,就会发生内存泄漏。随着时间的推移,泄漏的内存会累积,导致应用程序性能变差,甚至崩溃。泄漏可能发生在任何程序和平台上,但由于活动生命周期的复杂性,这种情况在Android应用中尤其普遍。最新的Android模式,如ViewModel和Life......
  • Android实现人脸识别动画效果
    效果展示实现步骤1.绘制圆圈遮罩这里我们是用了混合模式来实现圆圈部分的扣除,这里我们用到了PorterDuff.Mode.CLEAR/***绘制圆圈遮罩*@paramcanvas*/privatevoiddrawCircleMask(Canvascanvas){canvas.save();//目标图Dst......
  • 2023年Android中高级最全面试题(含大厂原题+解析)
    前言又快要到了一年一度的金九银十黄金跳槽时节,也是互联网大厂疯狂招人的时期,现在应该有很多Android程序员已经按耐不住了。但是现在网上的面试题资料太多了,而且有些面试题已经过时甚至是漏洞百出。今天结合自己前段时间的面试经历和几位大厂大佬交流讨论总结出这份2023年Android中......
  • 程序员必知的Android 代码规范
    前言虽然我们项目的代码时间并不长,也没经过太多人手,但代码的规范性依然堪忧,目前存在较多的比较自由的「代码规范」,这非常不利于项目的维护,代码可读性也不够高,此外,客户端和后端的研发模式也完全不同,后端研发基本都是基于SOA思想的,通常一个子系统3个人一起维护就已经是很充分的人......
  • Android Studio 项目的文件说明
    生成的目录结构 1..gradle和.ideal是AndroidStudio自动生成的,一般不需要修改,在项目完成后打包时,这两个文件可以删除,以减少文件代码量。2. app目录中:存放项目的代码和资源,是工作中的核心目录。其中2.1build目录通过build菜单中的makeproject生成的各种文......
  • xamarin.Android:获取局域网络
    通过Java.Net层,调用Java接口///<summary>///获取网络列表///</summary>privateDictionary<string,NetworkInfoBean>GetNetworkInfoList(){Dictionary<string,NetworkInfoBean>result=newDictiona......
  • Android串口调试 libserial_port.so: has text relocations
    遇到问题:Android串口调试libserial_port.so:hastextrelocations解决方法1在Android.mk文件中加入:LOCAL_LDFLAGS+=-fPIC,重新编译Google开源库的源码,生成.so库LOCAL_PATH:=$(callmy-dir)include$(CLEAR_VARS)TARGET_PLATFORM:=android-3......