和尚在之前学习 SharedPreferences 源码时注意到,其数据存储主要用到了 ArrayMap,和尚在日常中对于 key-value 方式主要是 HashMap 居多,今天简单研究一下...源码分析 构造函数 public ArrayMap() { this(0, false); } public ArrayMap(int capacity) { this(capacity...mArray[index<<1] = key; mArray[(index<<1)+1] = value; mSize++; return null; } 和尚在源码处打了几个需要注意的...hash; index <<= 1; mArray[index] = key; mArray[index+1] = value; } 简单查看 append() 源码...---- 和尚对 ArrayMap 的源码了解还不够深入,与其他存储方式的横向对比也不够全面;如有错误请多多指导! 来源:阿策小和尚
问:ArrayMap vs HashMap,要怎么选?...答:当size小于等于8的时候,选择ArrayMap,其他情况下选择hashmap ArrayMap的优势:更节约内存 内存增长慢:arraymap内存增加是每次增加1.5倍,而hashmap是每次增加...了,下面继续用自问自答的方式了解下arraymap 存储载体是什么 存储的载体,才是了解一个map的本质,ArrayMap的载体是两个数组,一个是存储Key的hash值,一个是存储key跟value...,另外,arraymap存在两个版本,一个是AndroidX,一个是系统framework //framework自带的arraymap android.util.ArrayMap //Androidx...的arraymap androidx.collection.ArrayMap 使用的时候,切记使用Androidx的arraymap,以保证在所有版本的系统上,表现一致
所以我们在一些情况下可以使用SparseArray和ArrayMap来代替HashMap。...二:ArrayMap ArrayMap是一个映射的数据结构,它设计上更多的是考虑内存的优化,内部是使用两个数组进行数据存储,一个数组记录key的hash值,另外一个数组记录Value...ArrayMap方法: public V put(K key, V value) public V get(Objectkey) public V remove(Objectkey) public...K keyAt(int index) public V valueAt(int index) ArrayMap应用场景 1.数据量不大,最好在千级以内 2.数据结构类型为Map类型
在hashmap源码中,put方法会调用indexFor方法,这个方法主要是根据key的hash值找到这个entry在table中的位置,最后 return 的是 h&(length-1) 3.HashMap...ArrayMap ArrayMap的Key和Value同HashMap一样都可以存放多种类型,ArrayMap对象的数据存储格式如下: 1.mHashes是一个记录所有key的hashcode值组成的数组...中有两个非常重要的静态成员变量mBaseCache和mTwiceBaseCacheSize,用于ArrayMap所在进程的全局缓存功能: mBaseCache:用于缓存大小为4的ArrayMap,mBaseCacheSize...ArrayMap的扩容 当mSize大于或等于mHashes数组长度时则扩容,完成扩容后需要将老的数组拷贝到新分配的数组,并释放老的内存。...ArrayMap也是非线程安全的类
进行下列代码: val arrayMap=ArrayMap() arrayMap[SameHashObj(0)] = "0"...arrayMap[SameHashObj(1)] = "1" arrayMap[SameHashObj(2)] = "2" arrayMap[SameHashObj(3)...多说一点 ArrayMap一共有三个构造方法,其中有一个是hide的,如下: public ArrayMap() { this(0, false); } /**...* Create a new ArrayMap with a given initial capacity. */ public ArrayMap(int capacity) {...参考 ArrayMap 深度解读ArrayMap优势与缺陷 深入剖析 Android中的 ArrayMap
为此,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。...4.3 ArraySet ArraySet也是Android特有的数据结构,用于替代HashSet的,跟ArrayMap出自同一个作者,从源码来看ArraySet跟ArrayMap几乎完全一致,包含缓存机制
而Android中引入了一个新的集合,叫做ArrayMap,为键值对存储需求增加了一种选择。...ArrayMap是什么 一个通用的key-value映射数据结构 相比HashMap会占用更少的内存空间 android.util和android.support.v4.util都包含对应的ArrayMap...类 ArrayMap的内部结构 ?...如果当前ArrayMap容量过大(大于BASE_SIZE*2)并且持有的数据量过小(不足1/3)则降低ArrayMap容量,减少内存占用 如果不符合上面的情况,则从mHashes删除对应的值,将mArray...ArrayMap设计者为了避免创建不必要的对象,减少GC的压力。采用了类似对象池的优化设计。 这其中设计到几个元素 BASE_SIZE 值为4,与ArrayMap容量有密切关系。
This article will show why and when use ArrayMap and SparseArray to optimize your Android Applications...Android provides you the ArrayMap which you should consider over HashMap....HashMap vs ArrayMap HashMap comes in the package : java.util.HashMap ArrayMap comes in the package :...android.util.ArrayMap and android.support.v4.util.ArrayMap....ArrayMap ArrayMap uses 2 arrays.
ClickHouse : arrayMap, arrayJoin or ARRAY JOIN memory usage Why arrayMap, arrayFilter, arrayJoin use...arrayMap-like functions memory usage calculation....In order to calculate arrayMap or similar array* functions ClickHouse temporarily does arrayJoin-like...SELECT arrayMap(x -> ((array_1[x]) * (array_2[x])), arrayEnumerate(array_1)) AS multi FROM ( SELECT...SELECT arrayMap((x, y) -> (x * y), array_1, array_2) AS multi FROM ( SELECT [1, 2, 3, 4,
那么为什么会这样子呢,笔者带大家从源码的角度来分析一下,我们来看一下关于SharedPreferences的源码。...中是否存在该File对象,不存在则创建一个并放入ArrayMap,然后调用getSharedPreferences的重载方法getSharedPreferences(file, mode),我们看一下这个方法的源码...我们直接看一下SharedPreferencesImpl的源码,验证一下我们的猜想。...为什么在同个进程却又没有问题呢,或者其他线程对SharedPreferences的获取在值修改完毕之后也没有问题,这里我们看一下SharedPreferencesImpl的内部类EditorImpl的源码...中获取对应的File(无的话则创建ArrayMap或在ArrayMap中添加该键值对),然后调用重载方法getSharePreferences(File file,int mode)传入file,该方法中将通过包名从缓存中获取
源码分析 在上篇文章介绍 ContentResolver 时提到,外界(包括当前进程的其他组件)也无法直接访问 ContentProvider 的,而是需要通过ContentResolver来间接访问,...的源码: 1.1 获取 IContentProvider 对象 源码中 ContentResolver#acquireProvider() 是抽象方法,具体实现在子类 ApplicationContentResolver...中,源码位于 ContextImpl 内部: ContextImpl.java 内部类 ApplicationContentResolver: -> 1、获取 IContentProvider 对象...= new ArrayMap(); final ArrayMap mProviderRefCountMap...= new ArrayMap(); final ArrayMap mLocalProviders
} } arrayPos[i][0]=xPos; arrayPos[i][1]=yPos; } //地图数组 int arrayMap...[xPos][yPos]=-1; } for(i=0;i<6;i++) { for(j=1;j<6;j++) { if(arrayMap...[i][j]==-1) { continue; } arrayMap[i][j]=...yPos=-1; printf("请输入坐标:X,Y\n"); scanf("%d%d",&xPos,&yPos); if(arrayMap...arrayMask[xPos][yPos]=1; } return 0; } ps;跟着老师码了一个小时的代码,最后竟然都是错误的,无奈的我只能去学习群找源码了
趁此机会,精读了一遍 SharedPreferences 源码,下面就来说说 SharedPreferences 都有哪些槽点。 ...源码解析 SharedPreferences 的使用很简单,这里就不再演示了。...; } sSharedPrefsCache 是一个嵌套的 ArrayMap,其定义如下: private static ArrayMap> sSharedPrefsCache; 以包名为 key...如果存在直接返回,反之创建一个新的 ArrayMap 作为值并存入缓存。 ...后面看到 getXXX() 方法的源码时,你就会看到它需要等待 sp 文件加载完成,否则就会阻塞。
趁此机会,精读了一遍 SharedPreferences 源码,下面就来说说 SharedPreferences 都有哪些槽点。...源码解析 SharedPreferences 的使用很简单,这里就不再演示了。...,其定义如下: private static ArrayMap> sSharedPrefsCache; 以包名为...如果存在直接返回,反之创建一个新的 ArrayMap 作为值并存入缓存。...后面看到 getXXX() 方法的源码时,你就会看到它需要等待 sp 文件加载完成,否则就会阻塞。
React-Native安卓预加载优化方案 为了优化React-Native安卓端线上业务的用户体验,我们提出了React-Native安卓Bundle预加载优化方案 首先展示的是React-Native安卓源码端...(Throwable e) { Logger.e(TAG, e); } } } 在init操作中,我们通过ReactInfo缓存把view缓存在本地的ArrayMap...同时为了优化React-Native线上项目内存方面的占用率,在ReactActivity销毁后,我们需要使用onDestroy()方法把view从 parent 上卸载下来 获取预加载之后缓存在本地ArrayMap...中的rootView 为了获取并使用预加载之后缓存在本地ArrayMap中的rootView,我们需要侵入activity的创建过程,因此我们需要对React-Native原生库库提供的ReactActivity...如下图所示: ReactPreLoader.init(this, ReactCardActivity.reactInfo); 其中ReactCardActivity继承上一个模块中对React-Native源码库进行简单改造后的
然后看下intent的put方法源码: public @NonNull Intent putExtra(String name, Parcelable value) { if (mExtras =...Bundle内部是由ArrayMap实现的,ArrayMap的内部实现是两个数组,一个int数组是存储对象数据对应下标,一个对象数组保存key和value,内部使用二分法对key进行排序,所以在添加、删除...而HashMap内部则是数组+链表结构,所以在数据量较少的时候,HashMap的Entry Array比ArrayMap占用更多的内存。...因为使用Bundle的场景大多数为小数据量,我没见过在两个Activity之间传递10个以上数据的场景,所以相比之下,在这种情况下使用ArrayMap保存数据,在操作速度和内存占用上都具有优势,因此使用
public static ActivityThread currentActivityThread() { return sCurrentActivityThread; } } 源码路径...@GuardedBy("mResourcesManager") final ArrayMap> mPackages = new...ArrayMap(); } 源码路径 : /frameworks/base/core/java/android/app/ActivityThread.java 获取到 LoadedApk 实例对象后...就可以获取该实例对象的 ClassLoader 类加载器 对象 ; public final class LoadedApk { private ClassLoader mClassLoader; } 源码路径
作者:godliness 链接:https://www.jianshu.com/p/5fcef7f68341 前言 本文不是与大家一起探讨关于 SharedPreferences 的基本使用,而是结合源码的角度分析对...那么让我们从源码角度出发(基于 API Level 28)吧。...容器 //早期是HashMap,ArrayMap相比HashMap在内存占用上略有一定优势 sSharedPrefsCache = new ArrayMap();...} final String packageName = getPackageName(); //根据应用包名,获取ArrayMap对象 ArrayMap<File, SharedPreferencesImpl...从源码中我们可以看出,操作数据都保存在 EditorImpl 中的 mModified 容器中,最后我们必须通过 commit 或 apply 进行提交,这里也是我们重点要分析的。 ?
: 数据结构 ArrayMap 和 SparseArray 采用的都是两个数组,Android专门针对内存优化而设计的 HashMap 采用的是数据+链表+红黑树 内存优化 ArrayMap 比 HashMap...更节省内存,综合性能方面在数据量不大的情况下,推荐使用 ArrayMap; Hash 需要创建一个额外对象来保存每一个放入 map 的 entry,且容量的利用率比 ArrayMap 低,整体更消耗内存...性能方面: ArrayMap 查找时间复杂度 O(logN);ArrayMap 增加、删除操作需要移动成员,速度相比较慢,对于个数小于 1000 的情况下,性能基本没有明显差异 HashMap 查找、修改的时间复杂度为...并发问题 ArrayMap 是非线程安全的类,大量方法中通过对 mSize 判断是否发生并发,来决定抛出异常。...这一点的处理比 ArrayMap 更有全面。
和 SimpleArrayMap —— 替代HashMap 其中,ArrayMap 是 Map的子类,而SimpleArrayMap 不是。...//创建一个ArrayMap key和value都是String类型 可以是任意类型 ArrayMap arrayMap = new ArrayMap(); //存...arrayMap.put("username", "zhangsan"); arrayMap.put("password", "123456"); //取 arrayMap.get(..."username"); arrayMap.get("password"); ** 总结说明: (1)如果key的类型是int、long或者boolean类型,那么使用SparseArray,因为它避免了自动装箱的过程...; (2)如果key类型为其它的类型,则使用ArrayMap; (3)两个数据结构都适合数据量不是特别大的情况。
领取专属 10元无门槛券
手把手带您无忧上云