Android编程之SparseArray<E>详解
最近编程时,发现一个针对HashMap<Integer, E>的一个提示:
翻译过来就是:用SparseArray<E>来代替会有更好性能。
那我们就来看看源码中SparseArray到底做了哪些事情:
一、构造
从构造方法我们可以看出,它和一般的List一样,可以预先设置容器大小,默认的大小是10:
- public SparseArray() {
- this(10);
- }
- public SparseArray(int initialCapacity) {
- ......
- }
二、增
它有两个方法可以添加键值对:
- public void put(int key, E value)
- public void append(int key, E value)
在存储数据的时候,是采用了二分法方式,以下是它采用二分法的源码:
- private static int binarySearch(int[] a, int start, int len, int key) {
- int high = start + len;
- int low = start - 1;
- while (high - low > 1) {
- int guess = (high + low) / 2;
- if (a[guess] < key) {
- low = guess;
- continue;
- }
- high = guess;
- }
- if (high == start + len)
- return start + len ^ 0xFFFFFFFF;
- if (a[high] == key) {
- return high;
- }
- return high ^ 0xFFFFFFFF;
- }
所以,它存储的数值都是按键值从小到大的顺序排列好的。
三、查
它有两个方法可以取值:
- public E get(int key)
- public E get(int key, E valueIfKeyNotFound)
最后一个从传参的变量名就能看出,传入的是找不到的时候返回的值
查看第几个位置的键:
- public int keyAt(int index)
查看第几个位置的值:
- public E valueAt(int index)
查看键所在位置,由于采用二分法查找键的位置,所以没有的话返回小于0的数值,而不是返回-1,这点要注意,返回的负数其实是表示它在哪个位置就找不到了,如果你存了5个,查找的键大于5个值的话,返回就是-6:
- public int indexOfKey(int key)
查看值所在位置,没有的话返回-1:
- public int indexOfValue(E value)
四、删
它有四个方法:
- public void delete(int key)
- public void remove(int key)
但其实,delete和remove的效果是一样的,remove方法中调用了delete方法,remove源码:
- public void remove(int key) {
- delete(key);
- }
- public void removeAt(int index)
- public void clear()
最后一个就是清除全部
五、改
- public void setValueAt(int index, E value)
- public void put(int key, E value)
put方法还可以修改键值对,注意:如果键不存在,就会变为添加新键值对
六、其他:
SparseArray实现了Cloneable接口,还可以调用clone方法。
小结:既然android系统建议我们用SparseArray<E>来代替HashMap<Integer, E>,那我们还是按它说的做吧。里面的一些方法,我在这里也已经剖析清楚了,希望能对你们有所帮助。
Android编程之SparseArray<E>详解的更多相关文章
- shell编程之awk命令详解
shell编程之awk命令详解 a:focus { outline: thin dotted #333; outline: 5px auto -webkit-focus-ring-color; out ...
- Android编程之LayoutInflater的inflate方法详解
LayoutInflater的inflate方法,在fragment的onCreateView方法中经常用到: public View onCreateView(LayoutInflater infl ...
- Android 多线程之IntentService 完全详解
关联文章: Android 多线程之HandlerThread 完全详解 Android 多线程之IntentService 完全详解 android多线程-AsyncTask之工作原理深入解析(上) ...
- Android 多线程之HandlerThread 完全详解
关联文章: Android 多线程之HandlerThread 完全详解 Android 多线程之IntentService 完全详解 android多线程-AsyncTask之工作原理深入解析(上) ...
- Android Telephony分析(三) ---- RILJ详解
前言 本文主要讲解RILJ工作原理,以便更好地分析代码,分析业务的流程.这里说的RILJ指的是RIL.java (frameworks\opt\telephony\src\java\com\andro ...
- Drawable实战解析:Android XML shape 标签使用详解(apk瘦身,减少内存好帮手)
Android XML shape 标签使用详解 一个android开发者肯定懂得使用 xml 定义一个 Drawable,比如定义一个 rect 或者 circle 作为一个 View 的背景. ...
- Android图片缓存之Bitmap详解
前言: 最近准备研究一下图片缓存框架,基于这个想法觉得还是先了解有关图片缓存的基础知识,今天重点学习一下Bitmap.BitmapFactory这两个类. 图片缓存相关博客地址: Android图片缓 ...
- Android Design Support Library使用详解
Android Design Support Library使用详解 Google在2015的IO大会上,给我们带来了更加详细的Material Design设计规范,同时,也给我们带来了全新的And ...
- Android 之窗口小部件详解--App Widget
Android 之窗口小部件详解--App Widget 版本号 说明 作者 日期 1.0 添加App Widge介绍和示例 Sky Wang 2013/06/27 1 App ...
随机推荐
- PHP7编译错误:php编译undefined reference to `libiconv 错误
ext/gd/libgd/.libs/gdkanji.o: In function `do_convert’: /root/php-5.2.12/ext/gd/libgd/gdkanji.c:350: ...
- android ndk调用OpenGL 实现纹理贴图Texture
android ndk调用OpenGL 实现纹理贴图Texture 时间 2014-06-25 05:24:39 CSDN博客 原文 http://blog.csdn.net/chrisfxs/a ...
- 五种JSP页面跳转方法详解
1. RequestDispatcher.forward() 是在服务器端起作用,当使用forward()时,Servlet engine传递HTTP请求从当前的Servlet or JSP到另外一个 ...
- A - 娜娜梦游仙境系列——诡异的钢琴
A - 娜娜梦游仙境系列——诡异的钢琴 Time Limit: 2000/1000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Othe ...
- 【Machine Learning in Action --2】K-近邻算法改进约会网站的配对效果
摘自:<机器学习实战>,用python编写的(需要matplotlib和numpy库) 海伦一直使用在线约会网站寻找合适自己的约会对象.尽管约会网站会推荐不同的人选,但她没有从中找到喜欢的 ...
- ios控件 UIImageView
UIImageView的作用是显示图片和多张动态的图片 - (id)initWithImage:(UIImage *)image;//初始化图片视图 - (id)initWithImage:(UI ...
- TextBox只读时不能通过后台赋值取值解决办法
给页面的TextBox设置ReadOnly="True"时,在后台代码中不能赋值取值,下边几种方法可以避免: 1.不设置ReadOnly,设置onfocus=this.blur( ...
- Win7 “Bluetooth设置”对话框无法打开,及无法查找到设备
方法是在百度上找到的,试用成功. 1.打开开始菜单中的运行选项,然后在对话框中输入services.msc,回车打开服务界面: 2.然后在弹出来的服务窗口中查找到Bluetooth Support S ...
- 【0-1 背包模板】 poj 3624
先看个未经优化的二维空间dp: #include <iostream> #include <cstdio> #include <cmath> #include &l ...
- 【二分图】 poj 1466
#include <iostream> #include <memory.h> #include <cstdio> using namespace std; int ...