SparseArray

谈谈源码中的SparseArray

橙三吉。 提交于 2019-12-10 17:43:23
谈谈源码中的SparseArray 在Andorid的源码和第三方库中,偶尔能看到该类,我们先来看一下官方文档的说明如下: SparseArray map integers to Objects. Unlike a normal array of Objects,there can be gaps in the indices. It is intended to be more memory efficient than using a HashMap to map Integers to Objects, both because it avoids auto-boxing keys and its data structure doesn't rely on an extra entry object for each mapping. 上面的意思是SparseArray 用来替代HashMap Int到Object的这种关系。 它设计的目的是为了比HashMap更加节省内存,这是因为: 它避免了键值的自动装箱 他的数据结构不需要依赖额外的对象来完成映射。 Note that this container keeps its mappings in an array data structure,using a binary search to find keys. The

Android 应用性能优化-ArrayMap、SparseArray

时间秒杀一切 提交于 2019-12-10 16:58:05
Android系统针对移动平台端,编写了一些高效的容器API,比如ArrayMap、SparseArray,今天我门来使用这个API。 如果有以下场景的代码使用,Android建议我们替换新的容器API。 应用场景1 HashMap<E, E> HashMap<String, String> map = new HashMap<>(); map.put("A", "A"); map.put("B", "B"); map.put("C", "C"); // 替换成如下 ArrayMap<String, String> map = new ArrayMap<>(); map.put("A", "A"); map.put("B", "B"); map.put("C", "C"); 应用场景2 HashMap<Integer, String> HashMap<Integer, String> list = new HashMap<>(); list.put(1, "A"); // 替换成如下 SparseArray<String> list = new SparseArray<>(); list.append(1, "A"); HashMap<Integer, Boolean> HashMap<Integer, Boolean> list = new HashMap<>(); list

性能优化:使用SparseArray代替HashMap<Integer,Object>

孤街醉人 提交于 2019-12-10 16:18:09
HashMap是java里比较常用的一个集合类,我比较习惯用来缓存一些处理后的结果。最近在做一个Android项目,在代码中定义这样一个变量,实例化时,Eclipse却给出了一个 performance 警告。 意思就是说用SparseArray<E>来替代,以获取更好性能。老实说,对SparseArray并不熟悉,第一感觉应该是Android提供的一个类。按住Ctrl点击进入SparseArray的源码,果不其然,确定是Android提供的一个工具类。 单纯从字面上来理解,SparseArray指的是 稀疏数组(Sparse array) ,所谓稀疏数组就是数组中大部分的内容值都未被使用(或都为零),在数组中仅有少部分的空间使用。因此造成内存空间的浪费,为了节省内存空间,并且不影响数组中原有的内容值,我们可以采用一种压缩的方式来表示稀疏数组的内容。 假设有一个9*7的数组,其内容如下: 在此数组中,共有63个空间,但却只使用了5个元素,造成58个元素空间的浪费。以下我们就使用稀疏数组重新来定义这个数组: 其中在稀疏数组中第一部分所记录的是原数组的列数和行数以及元素使用的个数、第二部分所记录的是原数组中元素的位置和内容。经过压缩之后,原来需要声明大小为63的数组,而使用压缩后,只需要声明大小为6*3的数组,仅需18个存储空间。 继续阅读SparseArray的源码

SparseArray替代HashMap来提高性能

人盡茶涼 提交于 2019-12-10 16:17:24
SparseArray 是 Android框架独有的类,在标准的JDK中不存在这个类。它要比 HashMap 节省内存,某些情况下比HashMap性能更好,按照官方问答的解释,主要是因为SparseArray不需要对key和value进行auto- boxing(将原始类型封装为对象类型,比如把int类型封装成Integer类型),结构比HashMap简单(SparseArray内部主要使用 两个一维数组来保存数据,一个用来存key,一个用来存value)不需要额外的额外的数据结构(主要是针对HashMap中的HashMapEntry 而言的)。是骡子是马得拉出来遛遛,下面我们就通过几段程序来证明SparseArray在各方面表现如何,下面的试验结果时在我的Hike X1(Android 4.2.2)手机上运行得出的。 代码1: int MAX = 100000; long start = System.currentTimeMillis(); HashMap<Integer, String> hash = new HashMap<Integer, String>(); for (int i = 0; i < MAX; i++) { hash.put(i, String.valueOf(i)); } long ts = System.currentTimeMillis() -