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

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

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

[java] view plaincopy

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

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

[java] view plaincopy

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

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

[java] view plaincopy

 
  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. }

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

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

[java] view plaincopy

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

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

查看第几个位置的键:

[java] view plaincopy

 
  1. public int keyAt(int index)

查看第几个位置的值:

[java] view plaincopy

 
  1. public E valueAt(int index)

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

[java] view plaincopy

 
  1. public int indexOfKey(int key)

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

[java] view plaincopy

 
  1. public int indexOfValue(E value)

四、删
它有四个方法:

[java] view plaincopy

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

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

[java] view plaincopy

 
  1. public void remove(int key) {
  2. delete(key);
  3. }
[java] view plaincopy

 
  1. public void removeAt(int index)
  2. public void clear()

最后一个就是清除全部

五、改

[java] view plaincopy

 
  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(HaspMap替换)的更多相关文章

  1. android小知识之EditText输入框之值监控以及类型限制(数字,英语字母,下划线,是否为星号密码)

    1.设置EditText的值监听事件 . <span style="font-size:14px;color:#990000;"> EditText ed=new Ed ...

  2. Android 小知识

    1.判断sd卡是否存在 boolean sdCardExist = Environment.getExternalStorageState().equals(android.os.Environmen ...

  3. android小知识之fragment中调用startActivityForResult(Intent intent,int requestcode)所遇到的问题

    大家都知道对于Activity和Fragment都可以注册OnActivityResult()方法,但是要注意几点: a.当activity和fragment都注册了OnActivityResult( ...

  4. android小知识之邮箱地址输入自动完成

    虽然不难,但是容易忘记,做个备忘吧 package com.guet.zhuge; import android.app.Activity; import android.os.Bundle; imp ...

  5. android小知识之圆角ListView

    有些东西看多了,就厌烦了:extjs对我这种感觉最为强烈.甚至,有时觉得设计之殇是审美疲劳.直角看多了,就想看看圆角,不知何时,这几年刮起了一阵阵的圆角设计风:CSS新标准纳入圆角元素,iphone中 ...

  6. android小知识之意图(intent)

    android中的意图有显示意图和隐式意图两种, 显示意图要求必须知道被激活组件的包和class 隐式意图只需要知道跳转activity的动作和数据,就可以激活对应的组件 A 主activity  B ...

  7. android小知识之自定义通知(toast)

    Toast是较为熟悉的通知,但默认方式比较单调,可以根据自己的需求自定义,在统一UI风格的时候可以单独拿出来做一个工具类来使用. 下面我在Fragment中定义的一个按键弹出自定义Toast,在Act ...

  8. android小知识之中如何获取当前时间

    百度整理过来的 [java] view plaincopyprint? import    java.text.SimpleDateFormat; SimpleDateFormat    format ...

  9. Android小知识汇总

    1.Android Studio 将module编译打包成aar文件,module依赖的 (例如 compile 'com.zhy:autolayout:1.4.3' )不会被打包进入aar文件,应用 ...

随机推荐

  1. 项目中经常用到的reset.css文件

    html,body{width:100%; height: auto;} *{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box- ...

  2. 安卓Xpost框架

    http://pcedu.pconline.com.cn/484/4841077_all.html

  3. CCF计算机认证——字符串匹配问题(运行都正确,为什么提交后只给50分?)

    我的程序: #include<iostream> #include<cctype> #include<string> #include<vector> ...

  4. 一致性哈希(Consistent Hashing)

    前言:对于一致性哈希已经不是罕见概念,在此只是对原有理论概念的一个整理和用自己的理解讲述,希望对新手有些许帮助,利人利己足矣. 1.概念 一致哈希是一种特殊的哈希算法.在使用一致哈希算法后,哈希表槽位 ...

  5. struts2 + jquery 开发环境下的ajax构建方法(action写法 + struts.xml配置 + js调用代码)

    1.action写法 public class RegisterAction extends ActionSupport { private InputStream inputStream; /** ...

  6. 使用cmake安装mysql5.5.13

    MySQL从5.5版本开始,通过./configure进行编译配置方式已经被取消,取而代之的是cmake工具.因此,我们首先要在系统中源码编译安装cmake工具. 安装cmake : tar zxvf ...

  7. nodejs 下载网页及相关资源文件

    功能其实很见简单,通过 phantomjs.exe 采集 url 加载的资源,通过子进程的方式,启动nodejs 加载所有的资源,对于css的资源,匹配css内容,下载里面的url资源 当然功能还是很 ...

  8. row_number() over (partition by....order by...)用法 分组排序

    row_number() over (partition by....order by...)用法 分组排序 row_number() OVER (PARTITION BY COL1 ORDER BY ...

  9. iOS6和iOS7代码的适配(4)——tableView

    iOS7上不少控件的样子有了变化(毕竟要扁平化嘛),不过感觉变化最大的肯定非tableView莫属.因为这个控件的高度可定制性,原先是使用及其广泛的,这样的一个改变自然也影响颇大. 1.accesso ...

  10. [置顶] Oracle GoldenGate 常见问题:长事务处理

    长事务的影响 OGG是基于事务级的实时复制工具,也就是说OGG只复制已提交的事务,在遇到事务的commit或rollback之前,它会将每个事务的操作存储在称为cache的托管虚拟内存池中.内存再大也 ...