展开

关键词

深度解读ArrayMap优势与缺陷

一、引言在移动设备端内存资很珍贵,HashMap为实现快速查询带来了很大内存浪费。 为此,2013年5月20日Google工程师Dianne Hackborn在Android系统中新增ArrayMap类。 在Android中可以发现不少提交专门把之前使用HashMap地方改用ArrayMap,不仅如此,大量的应用开发者中广为使用。然后,你是否研究过这么广泛使用的基础数据结构存在缺陷? 要回答这个问题,需要先从角度来理解ArrayMap的原理,阅读时长约30分钟。ArrayMap是Android专门针对内存优化而设计的,用于取代Java API中的HashMap数据结构。 HashMap的查找和插入时间复杂度为O(1)的代价是牺牲大量的内存来实现的,而SparseArray和ArrayMap性能略逊于HashMap,但更节省内存。接下来,从看看ArrayMap

48420

初识 ArrayMap

和尚在之前学习 SharedPreferences 时注意到,其数据存储主要用到了 ArrayMap,和尚在日常中对于 key-value 方式主要是 HashMap 居多,今天简单研究一下 ArrayMapArrayMap ArrayMap 是一种相较于 HashMap 具有更高内存效率的 key-value 对存储结构;ArrayMap 内部包括两个数组结构,分别是专门用来存储 HashCode 的 mHashes 和用来存储 key-value 的 Object 数组类型的 mArray; ArrayMap 是非线程安全的;? 分析构造函数public ArrayMap() { this(0, false);} public ArrayMap(int capacity) { this(capacity, false);} public ArrayMap(int capacity, boolean identityHashCode) { mIdentityHashCode = identityHashCode; if (capacity

19030
  • 广告
    关闭

    50+款云产品免费体验

    提供包括云服务器,云数据库在内的50+款云计算产品。打造一站式的云产品试用服务,助力开发者和企业零门槛上云。

  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    ArrayMap数据结构分析

    分析ArrayMap的结构是int mArray记录Key和Value,对于每一组Key和Value,按照Key和Value的顺序排列。 进行下列代:val arrayMap=ArrayMap() arrayMap = 0 arrayMap = 1 arrayMap = 2 arrayMap = 3 arrayMap = 4最终结构是这样的 多说一点ArrayMap一共有三个构造方法,其中有一个是hide的,如下:public ArrayMap() { this(0, false); } ** * Create a new ArrayMap put()方法中有如下代: public V put(K key, V value) { final int osize = mSize; final int hash; int index; if 参考ArrayMap深度解读ArrayMap优势与缺陷深入剖析 Android中的 ArrayMap

    36110

    深入理解Activity启动流程和AMS框架(一)

    没关系,今天我们将结合和一些优秀文章,站在巨人的肩膀上,用更加通俗易懂的方式来试着解开谜底。毕竟代繁多、经验有限,如果有纰漏的地方希望大家指正,相互学习。 Android应用程序的载体是APK文件,它是一个组件和资的容器。 mActivities = new ArrayMap();final ArrayMap mServices = new ArrayMap();final ArrayMap mPackages = new ArrayMap();final ArrayMap mResourcePackages = new ArrayMap();final ArrayMap mProviderMap = new ArrayMap mResourceManager管理应用的资。mPackages和mResourcesPackages保存的是应用apk包的信息。

    74410

    细数 SharedPreferences 的那些槽点 !

    趁此机会,精读了一遍 SharedPreferences ,下面就来说说 SharedPreferences 都有哪些槽点。 解析SharedPreferences 的使用很简单,这里就不再演示了。 下面就按 获取 SharedPreference 、getXXX() 获取数据 和 putXXX()存储数据 这三方面来阅读。1. 看了这么长的,别忘了我们还停留在 getSharedPreferences()方法,也就是获取 SharedPreferences 的过程中。 后面看到 getXXX() 方法的时,你就会看到它需要等待 sp 文件加载完成,否则就会阻塞。

    10530

    APK安装流程详解6——PackageManagerService启动前奏

    SystemApi、@hide Android注解简介一、Settings类简介由于在后面讲解PackageManager流程启动的时候会 涉及到Setting类,我们就先预热下 Settings.java地址 mSetting与ShareUserSetting.png二、SystemConfig类简介SystemConfig.java地址 SystemCofig代表系统配置信息1、SystemConfig SystemConfig.png三、ServiceThread类与PackageHandler类简介1、ServiceThread类ServiceThread.java地址 代很简单如下:** * ,”w“表示write的首字母 九、@GuardBy、@SystemApi、@hide Android注解简介(一)、@GuardBy注解 在阅读PackageManagerService.java的时 (二)、@SystemApi、@PrivateApi与@hide注解简介 在阅读PackageManager.java的时,里面有会大量用到两个注解@SystemApi和@hide注解 如下,代

    73920

    ArrayMap vs HashMap

    问:ArrayMap vs HashMap,要怎么选? 答:当size小于等于8的时候,选择ArrayMap,其他情况下选择hashmapArrayMap的优势:更节约内存内存增长慢:arraymap内存增加是每次增加1.5倍,而hashmap是每次增加2倍内存数组内存在部分场景下会全局复用当内容减少的时候 ,数组会缩小,降低内存每次保存的时候,不需要建新的对象,而hashmap每次保存都要新建Node对象ArrayMap的劣势:性能,还是性能每次检索是二分查找,时间复杂度O(logn),而hashmap大多数下仅仅是 ,可以在数量不超过8的时候,选择ArrayMap,数量不大的时候,两者的性能基本可以忽略;上一篇已经分析过hashmap了,下面继续用自问自答的方式了解下arraymap存储载体是什么 存储的载体,才是了解一个 map的本质,ArrayMap的载体是两个数组,一个是存储Key的hash值,一个是存储key跟valueint mArray; key和value 它们的关系,可以用这个图来形象的说明保存hash的数组跟保存

    9420

    深入剖析 Android中的 ArrayMap

    而Android中引入了一个新的集合,叫做ArrayMap,为键值对存储需求增加了一种选择。 ArrayMap是什么一个通用的key-value映射数据结构相比HashMap会占用更少的内存空间android.util和android.support.v4.util都包含对应的ArrayMapArrayMap的内部结构? 如上图所示,在ArrayMap内部有两个比较重要的数组,一个是mHashes,另一个是mArray。

    37530

    Android中传值Intent与Bundle的区别小结

    然后看下intent的put方法: public @NonNull Intent putExtra(String name, Parcelable value) { if (mExtras == null Bundle内部是由ArrayMap实现的,ArrayMap的内部实现是两个数组,一个int数组是存储对象数据对应下标,一个对象数组保存key和value,内部使用二分法对key进行排序,所以在添加、删除 而HashMap内部则是数组+链表结构,所以在数据量较少的时候,HashMap的Entry Array比ArrayMap占用更多的内存。 因为使用Bundle的场景大多数为小数据量,我没见过在两个Activity之间传递10个以上数据的场景,所以相比之下,在这种情况下使用ArrayMap保存数据,在操作速度和内存占用上都具有优势,因此使用

    14620

    Android - 看似内存泄漏,实则不是,记一次内存泄漏的案例分析

    需要从代层面进一步分析。  今天遇到的例子就是,通过上述方法,看似遇到了内存泄漏,其实不是。 通过代分析,在AccountPreferenceBase中,相关的代是如下,?   如果不再页面退出时,及时从ArrayMap中delete掉此binder对象,就会有内存泄漏的问题。 但是我们在onPause中发现,其实已经调用了removeStatusChangeListener,其内部就会调用unregister方法,从ArrayMap中delete掉正确的binder对象。 所以代的写法没有问题。 那是什么原因导致GC没有回收我们的Activity呢?

    441100

    React-Native 安卓预加载优化方案

    React-Native安卓预加载优化方案为了优化React-Native安卓端线上业务的用户体验,我们提出了React-Native安卓Bundle预加载优化方案首先展示的是React-Native安卓端 ReactActivity onCreate方法中的getReactInstanceManager()步骤中执行了bundle离线包文件位置与bundle文件名的设置,如下代所示 ReactInstanceManager.Builder 同时为了优化React-Native线上项目内存方面的占用率,在ReactActivity销毁后,我们需要使用onDestroy()方法把view从 parent 上卸载下来获取预加载之后缓存在本地ArrayMap 中的rootView为了获取并使用预加载之后缓存在本地ArrayMap中的rootView,我们需要侵入activity的创建过程,因此我们需要对React-Native原生库库提供的ReactActivity 如下图所示:ReactPreLoader.init(this, ReactCardActivity.reactInfo); 其中ReactCardActivity继承上一个模块中对React-Native库进行简单改造后的

    2K00

    Android开发之那些好用的数据结构与API

    );第二个参数是默认值sparseArray.put(2, 000000); 获取索引处的key与valuesparseArray.keyAt(1);sparseArray.valueAt(1);2.ArrayMap 和 SimpleArrayMap —— 替代HashMap 其中,ArrayMap 是 Map的子类,而SimpleArrayMap 不是。 创建一个ArrayMap key和value都是String类型 可以是任意类型ArrayMap arrayMap = new ArrayMap(); 存arrayMap.put(username, zhangsan password);** 总结说明: (1)如果key的类型是int、long或者boolean类型,那么使用SparseArray,因为它避免了自动装箱的过程; (2)如果key类型为其它的类型,则使用ArrayMap

    47450

    Android7.0中的ResourceNotFoundException

    跟踪WebView的创建非常复杂,而在ensureProviderCreated()函数中,会创建WebViewProvider对象,而创建的过程可以缩减成: mProvider=WebViewChromiumFactoryProvider.createWebView 其中: newAssetPath:systemappWebViewGoogleWebViewGoogle.apk,查看WebViewFactory.getLoadedPackageInfo()的可以看到 WebView中资的效果。 Paste_Image.png 而ResourceManager中,有一个ArrayMap,用来存储ResourcesKey和ResourcesImpl的映射表: private final ArrayMap mResourceImpls = new ArrayMap(); 而ResourcesImpl中只是对AssetManager、Drawable获取等的一层封装,以后可能会是一个APP会有多种Resources

    1K50

    Service 启动与绑定分析

    Service startService 方法分析在Activity调用startService方法实质调用的是ContextWrapper中的startService方法。 service实例创建Application实例创建ContextImpl对象,再通过Service的attach进行建立关系调用Service的onCreate方法进行创建服务对象,并存储在final ArrayMap mServices = new ArrayMap();集合中,ActivityThread类中调用handleServiceArgs方法,该方法中调用onStartCommand启动Service。 flags) {        synchronized (mServices) {            LoadedApk.ServiceDispatcher sd = null;            ArrayMap + sd + " for conn " + c);                if (map == null) {                    map = new ArrayMap

    12710

    SharedPreferences解析

    异步方式,没有返回值 editor.apply() 读取数据String blog = sp.getString(blog, );my_prefs.xml文件内容: www.xucanhui.com架构来分析(API 28)获取SharedPreferences可以通过 Activity.getPreferences(mode)、 PreferenceManager.getDefaultSharedPreferences behavior. sp.startReloadIfChangedUnexpectedly(); } return sp;}@GuardedBy(ContextImpl.class)private ArrayMap getSharedPreferencesCacheLocked() { if (sSharedPrefsCache == null) { sSharedPrefsCache = new ArrayMap 高频写操作的key与高频读操作的key可以适当地拆分文件, 由于减少同步锁竞争;不要一上来就执行getSharedPreferences().edit(), 应该分成两大步骤来做, 中间可以执行其他代

    26920

    告诉你:Android 不要滥用 SharedPreferences(上)

    作者:godliness链接:https:www.jianshu.comp5fcef7f68341前言本文不是与大家一起探讨关于 SharedPreferences 的基本使用,而是结合的角度分析对 那么让我们从角度出发(基于 API Level 28)吧。 API Level 28 分析的 ContextImpl 中关于 SharedPreferences 处理机制,这相较于较早版本的管理策略有所不同,具体你可以参考之前基于 API Level 16 分析的 ,但是不难理解,可以看出通过 BufferedInputStream 加载对应 SharedPreferences 文件内容,系统封装了 XmlUtils 进行 XML 文件数据读写,并且将数据封装在 从中我们可以看出,操作数据都保存在 EditorImpl 中的 mModified 容器中,最后我们必须通过 commit 或 apply 进行提交,这里也是我们重点要分析的。?

    15520

    linkToDeath机制了解和使用

    com.android.internal.os.ZygoteInit.main(ZygoteInit.java:554) at dalvik.system.NativeStart.main(Native Method)扩展这里讲一个Android中的类 public class RemoteCallbackList { ArrayMap mCallbacks = new ArrayMap(); private Object[] mActiveBroadcast mCallbacks) { mCallbacks.remove(mCallback.asBinder()); } onCallbackDied(mCallback, mCookie); } } ******其他代省略

    75920

    HashMap、LRU、散列表

    ArrayMap是Android专门针对内存优化而设计的,用于取代Java API中的HashMap数据结构。 对于key为其他类型则可使用ArrayMap。 ArraySet:和ArrayMap的目的类似,用来提高HashSet的效率。 使用方法跟HashSet类似ArrayMap的key是任意对象,list等等,一般是存一个键值,获取数据简单 map.keyAt(0) map.valueAt(0)ArrayMap的内部实现是两个数组, 为了减少频繁地创建和回收Map对象,ArrayMap采用了两个大小为10的缓存队列来分别保存大小为4和8的Map对象。

    23840

    腾讯Android研发岗必刷真题:说下组件之间的跳转和组件通信原理机制

    在目前开库中,有EventBus、RxBus就是采用这种发布订阅模式,优点是简化了Android组件之间的通信方式,实现解耦,让业务代更加简洁,可以动态设置事件处理线程和优先级,缺点则是每个事件需要维护一个事件类 那么在组件化开框架中有ModuleBus、CC 等等。 这两者模式更详细的对比,可以查看这篇文章多个维度对比一些有代表性的开android组件化开发方案实现方案事件总线,又可以叫做组件总线,路由+接口,则相对好理解点,今天从阅读它们框架,我们来对比这两种实现方案的不同之处 其中的核心代是在与 ModuleBus 类,其内部维护了两个ArrayMap键对值列表,如下:** * Object methodClass * String methodName; * MethodInfo method info * private static ArrayMap moduleEventMethods = new ArrayMap(); ** * Class IBaseClient.class

    1.5K20

    Android资动态加载以及相关原理分析

    目录下面就好,代如下public static void copyFileToSD(Context context) { try { InputStream fis = context.getAssets 动态加载资原理分析上面我们看了如何以插件的形式加载外部的资,实际上无论是加载外部资,还是加载宿主本身的资,它们的原理都是相同的,只要我们弄懂了宿主自身的资是如何加载的,那么对于上面的过程自然也就理解了 ResourcesManager的一些代:private static ResourcesManager sResourcesManager; private final ArrayMap mActiveResources = new ArrayMap(); private final ArrayMap mDisplays = new ArrayMap(); CompatibilityInfo mResCompatibilityInfo ResourcesKey 和ResourcesImpl 以及 Resources 和AssetManager的关系上面创建资的代中都出现了他们,那他们到底是什么关系呢?●.

    78380

    相关产品

    • 云服务器

      云服务器

      腾讯云服务器(CVM)为您提供安全可靠的弹性云计算服务。只需几分钟,您就可以在云端获取和启用云服务器,并实时扩展或缩减云计算资源。云服务器 支持按实际使用的资源计费,可以为您节约计算成本。

    相关资讯

    热门标签

    活动推荐

      运营活动

      活动名称
      广告关闭

      扫码关注云+社区

      领取腾讯云代金券