最近编程时,发现一个针对HashMap<Integer, E>的一个提示:

翻译过来就是:用SparseArray<E>来代替会有更好性能。
那我们就来看看源码中SparseArray到底做了哪些事情:

一、构造
从构造方法我们可以看出,它和一般的List一样,可以预先设置容器大小,默认的大小是10:

  1. public SparseArray() {
  2. this(10);
  3. }
  4. public SparseArray(int initialCapacity) {
  5. ......
  6. }

二、增
它有两个方法可以添加键值对:

  1. public void put(int key, E value)
  2. public void append(int key, E value)

在存储数据的时候,是采用了二分法方式,以下是它采用二分法的源码:

  1. private static int binarySearch(int[] a, int start, int len, int key) {
  2. int high = start + len;
  3. int low = start - 1;
  4. while (high - low > 1) {
  5. int guess = (high + low) / 2;
  6. if (a[guess] < key) {
  7. low = guess;
  8. continue;
  9. }
  10. high = guess;
  11. }
  12. if (high == start + len)
  13. return start + len ^ 0xFFFFFFFF;
  14. if (a[high] == key) {
  15. return high;
  16. }
  17. return high ^ 0xFFFFFFFF;
  18. }

所以,它存储的数值都是按键值从小到大的顺序排列好的。

三、查
它有两个方法可以取值:

  1. public E get(int key)
  2. public E get(int key, E valueIfKeyNotFound)

最后一个从传参的变量名就能看出,传入的是找不到的时候返回的值

查看第几个位置的键:

  1. public int keyAt(int index)

查看第几个位置的值:

  1. public E valueAt(int index)

查看键所在位置,由于采用二分法查找键的位置,所以没有的话返回小于0的数值,而不是返回-1,这点要注意,返回的负数其实是表示它在哪个位置就找不到了,如果你存了5个,查找的键大于5个值的话,返回就是-6:

  1. public int indexOfKey(int key)

查看值所在位置,没有的话返回-1:

  1. public int indexOfValue(E value)

四、删
它有四个方法:

  1. public void delete(int key)
  2. public void remove(int key)

但其实,delete和remove的效果是一样的,remove方法中调用了delete方法,remove源码:

  1. public void remove(int key) {
  2. delete(key);
  3. }
  1. public void removeAt(int index)
  2. public void clear()

最后一个就是清除全部

五、改

  1. public void setValueAt(int index, E value)
  2. public void put(int key, E value)

put方法还可以修改键值对,注意:如果键不存在,就会变为添加新键值对

六、其他:
SparseArray实现了Cloneable接口,还可以调用clone方法。

小结:既然android系统建议我们用SparseArray<E>来代替HashMap<Integer, E>,那我们还是按它说的做吧。里面的一些方法,我在这里也已经剖析清楚了,希望能对你们有所帮助。

Android编程之SparseArray<E>详解的更多相关文章

  1. shell编程之awk命令详解

    shell编程之awk命令详解 a:focus { outline: thin dotted #333; outline: 5px auto -webkit-focus-ring-color; out ...

  2. Android编程之LayoutInflater的inflate方法详解

    LayoutInflater的inflate方法,在fragment的onCreateView方法中经常用到: public View onCreateView(LayoutInflater infl ...

  3. Android 多线程之IntentService 完全详解

    关联文章: Android 多线程之HandlerThread 完全详解 Android 多线程之IntentService 完全详解 android多线程-AsyncTask之工作原理深入解析(上) ...

  4. Android 多线程之HandlerThread 完全详解

    关联文章: Android 多线程之HandlerThread 完全详解 Android 多线程之IntentService 完全详解 android多线程-AsyncTask之工作原理深入解析(上) ...

  5. Android Telephony分析(三) ---- RILJ详解

    前言 本文主要讲解RILJ工作原理,以便更好地分析代码,分析业务的流程.这里说的RILJ指的是RIL.java (frameworks\opt\telephony\src\java\com\andro ...

  6. Drawable实战解析:Android XML shape 标签使用详解(apk瘦身,减少内存好帮手)

    Android XML shape 标签使用详解   一个android开发者肯定懂得使用 xml 定义一个 Drawable,比如定义一个 rect 或者 circle 作为一个 View 的背景. ...

  7. Android图片缓存之Bitmap详解

    前言: 最近准备研究一下图片缓存框架,基于这个想法觉得还是先了解有关图片缓存的基础知识,今天重点学习一下Bitmap.BitmapFactory这两个类. 图片缓存相关博客地址: Android图片缓 ...

  8. Android Design Support Library使用详解

    Android Design Support Library使用详解 Google在2015的IO大会上,给我们带来了更加详细的Material Design设计规范,同时,也给我们带来了全新的And ...

  9. Android 之窗口小部件详解--App Widget

    Android 之窗口小部件详解--App Widget  版本号 说明 作者 日期  1.0  添加App Widge介绍和示例  Sky Wang 2013/06/27        1 App ...

随机推荐

  1. jmeter3 测试soap协议-webservice接口

    1.新建一个线程组 2.在线程组下新增,SOAP请求 3.设置soap请求,然后就可以测试了

  2. python2.7学习记录之三

    1.连接数据库 MySQLdb的是一个接口连接到MySQL数据库服务器从Python.它实现了Python数据库API V2.0,并建上的MySQL C API的顶端. 下载地址:https://so ...

  3. leetcode387

    Given a string, find the first non-repeating character in it and return it's index. If it doesn't ex ...

  4. Windows server 2008搭建php运行环境

    下载php组件包 首先到http://windows.php.net/download/下载你需要的php版本,这里我下载的是php5.3. 下面解压php组件 包到磁盘上. 安装Microsoft ...

  5. OpenCV中Mat的列向量归一化

    OpenCV中Mat的列向量归一化 http://blog.csdn.net/shaoxiaohu1/article/details/8287528 OpenCV中Mat的列向量归一化 标签: Ope ...

  6. AngularJs多重视图和路由的使用

    使用AngularJs来做多重视图和路由是在方便不过了,在开发过程中,都有许多的页面,而这些页面都有相同的部分,比如页面的头部和尾部通常都是一样的,变化的都是主体部分,还有就是一些后端管理的一些项目, ...

  7. javascript: 字符串拼接有问题

    点击某个链接,出现js错误:Uncaught SyntaxError: Unexpected token ILLEGAL 原因: $str .= sprintf('&nbsp&nbsp ...

  8. 今天遇到了隐藏顶部菜单栏(top bar)的菜鸟问题,解决了。

    self.navigationController.navigationBarHidden = YES; http://stackoverflow.com/questions/3397381/hide ...

  9. 传统 Ajax 已死,Fetch 永生

    原谅我做一次标题党,Ajax 不会死,传统 Ajax 指的是 XMLHttpRequest(XHR),未来现在已被 Fetch 替代. 最近把阿里一个千万级 PV 的数据产品全部由 jQuery 的  ...

  10. Linux设置静态IP【转】

    一只小码 2016-08-16 10:32 测试服务器OS: Centos 6.5 x64 本机OS: Ubuntu 14.04 x64 由于Virtualbox当时安装Centos 6.5的时候设置 ...