android小知识之SparseArray(HaspMap替换)
最近编程时,发现一个针对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(HaspMap替换)的更多相关文章
- android小知识之EditText输入框之值监控以及类型限制(数字,英语字母,下划线,是否为星号密码)
1.设置EditText的值监听事件 . <span style="font-size:14px;color:#990000;"> EditText ed=new Ed ...
- Android 小知识
1.判断sd卡是否存在 boolean sdCardExist = Environment.getExternalStorageState().equals(android.os.Environmen ...
- android小知识之fragment中调用startActivityForResult(Intent intent,int requestcode)所遇到的问题
大家都知道对于Activity和Fragment都可以注册OnActivityResult()方法,但是要注意几点: a.当activity和fragment都注册了OnActivityResult( ...
- android小知识之邮箱地址输入自动完成
虽然不难,但是容易忘记,做个备忘吧 package com.guet.zhuge; import android.app.Activity; import android.os.Bundle; imp ...
- android小知识之圆角ListView
有些东西看多了,就厌烦了:extjs对我这种感觉最为强烈.甚至,有时觉得设计之殇是审美疲劳.直角看多了,就想看看圆角,不知何时,这几年刮起了一阵阵的圆角设计风:CSS新标准纳入圆角元素,iphone中 ...
- android小知识之意图(intent)
android中的意图有显示意图和隐式意图两种, 显示意图要求必须知道被激活组件的包和class 隐式意图只需要知道跳转activity的动作和数据,就可以激活对应的组件 A 主activity B ...
- android小知识之自定义通知(toast)
Toast是较为熟悉的通知,但默认方式比较单调,可以根据自己的需求自定义,在统一UI风格的时候可以单独拿出来做一个工具类来使用. 下面我在Fragment中定义的一个按键弹出自定义Toast,在Act ...
- android小知识之中如何获取当前时间
百度整理过来的 [java] view plaincopyprint? import java.text.SimpleDateFormat; SimpleDateFormat format ...
- Android小知识汇总
1.Android Studio 将module编译打包成aar文件,module依赖的 (例如 compile 'com.zhy:autolayout:1.4.3' )不会被打包进入aar文件,应用 ...
随机推荐
- BZOJ 2707: [SDOI2012]走迷宫( tarjan + 高斯消元 )
数据范围太大不能直接高斯消元, tarjan缩点然后按拓扑逆序对每个强连通分量高斯消元就可以了. E(u) = 1 + Σ E(v) / degree(u) 对拍时发现网上2个程序的INF判断和我不一 ...
- JavaWeb核心编程之(三.4)Servlet Context 配置
ServletContextServlet引擎为每个Web应用程序都创建一个对应的ServletContext对象, ServletContext对象被包含在ServletConfig对象中, 调用S ...
- win7 64位安装 oracle 11G 和 使用 PLSQL Developer 连接服务器
其实基本过程和网上大多数人的完全一样,只是后面的plsql上加了几张图片而已,以此给自己做个记录,万一网上的没了,这里自己还有,会了的大森(大神),就请路过吧 1.双击开始安装
- php curl函数实例
<?php function login(){ $url = 'http://jspatch.qq.com/offline/check?qver=6.2.0.427&hver=0& ...
- 关于require,require_once,include和include_once的区别
一.定义 require,require_once,include,include_once都属于PHP的关键字,也就是说它们实际都是PHP的语句,而不是函数,类似于print,echo一样,也是PH ...
- MRP工作台任务下达之计划组为必输
应用 Oracle Manufacturing Planning 层 Level Function 函数名 Funcgtion Name MRPFPPWB 表单名 Form Name MRPS ...
- android中onStartActivityForResult无返回值问题
在activity间跳转传递参数,常见方法是通过onStartActivityForResult来做.不过今天使用 onStartActivityForResult的时候已经在上一个activity调 ...
- Windows 7妙用 笔记本变无线AP轻松共享
笔记本变AP的前提和应用原理 笔记本变AP的前提是你所处的房间或地点需要提供有线宽带的连接,而且你的笔记本要有无线网卡.如果这两个条件具备了,即使没有路由器/无线AP等辅助设备,多个笔记本电脑共享上网 ...
- openNebula libvirt-virsh attach disk device for kvm
1,新建文件硬盘 qemu-img create -f qcow2 testdisk.img 2G
- Android Popupwindow 拖动
版本号:1.0 日期:2014.4.29 版权:© 2014 kince 转载注明出处 关于View的拖动大家应该比較了解了,比方对一个控件IamgeView拖动,或者一个视图View拖动,实现方式也 ...