最近编程时,发现一个针对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. iOS image caching. Libraries benchmark (SDWebImage vs FastImageCache)

    http://www.cocoachina.com/ios/20150128/11053.html 1.引言 过去的几年里,iOS应用在视觉方面越来越吸引人.图像展示是其中很关键的部分,因为大部分图像 ...

  2. HTML中加载flash方法

    首先贴上代码: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <t ...

  3. jquery 1.9版本后不在支持browser 方法的解决方案

    今天对jquery 进行升级,导致项目出错,原来在1.9版本之后 jquery 不支持browser 方法了.  官方建议的又不好用,所以我所jquery 原来的代码摘除来,又扩展回去. //解决jq ...

  4. android 布局页面文件出错故障排除Exception raised during rendering: java.lang.System.arraycopy([CI[CII)V

    今天在看布局文件的时候出现 android 布局页面文件出错故障排除Exception raised during rendering: java.lang.System.arraycopy([CI[ ...

  5. test错误记录

    1.Caused by: java.io.FileNotFoundException: D:\Program%20Files\Apache%20Software%20Foundation\Tomcat ...

  6. Chapter 2 Open Book——7

    I gunned my deafening engine to life, ignoring the heads that turned inmy direction, and backed care ...

  7. JS调用OC方法

    - (void)myMethod:(CDVInvokedUrlCommand*)command { NSString* echo = [command.arguments objectAtIndex: ...

  8. 编译 wl18xx驱动源码

    在做beagleboneblack移植的时候,wl18xx的驱动源码是自动编译的.但是移植到其他平台优越平台不一样,所以就不能自动编译 所以用其他方式编译.http://e2e.ti.com/supp ...

  9. Myeclipse 创建 Web Maven项目

    1.创建Web项目 添加Maven支持 2.pom.xml 报如下错误: 解决办法: pom.xml里面添加依赖: <dependency> <groupId>com.thou ...

  10. 国内的cdn

    测试了一下,百度的非常快 ----------------------------------------------------------------------- 原文:https://www. ...