SparseArray<E>详解
SparseArray<E> 是官方推荐的用来替代 HashMap<Integer, E> 的一个工具类,相比来说有着更好的性能(其核心是折半查找函数(binarySearch))。
通过源码来看下SparseArray<E>的一些使用特点:
-------------------------------------------------------------------------------------------------------
1、SparseArray可以预先设置容器大小,默认是10
/**
* Creates a new SparseArray containing no mappings.
*/
public SparseArray() {
this();
}
-------------------------------------------------------------------------------------------------------
2、增删改查
(1)两种添加数据的方法
public void put(int key, E value)
public void append(int key, E value)
其中append()内部调用了put()
put()内部又使用了二分法存储数据,由此可见:它存储的数值都是按键值从小到大的顺序排列好的
static int binarySearch(int[] array, int size, int value) {
int lo = ;
int hi = size - ;
while (lo <= hi) {
final int mid = (lo + hi) >>> ;
final int midVal = array[mid];
if (midVal < value) {
lo = mid + ;
} else if (midVal > value) {
hi = mid - ;
} else {
return mid; // value found
}
}
return ~lo; // value not present
}
(2)四种删除数据的方法
--前两种
public void delete(int key)
public void remove(int key)
两者作用是相同的,没区别,因为remove()内部就直接调用了delete()
/**
* Alias for {@link #delete(int)}.
*/
public void remove(int key) {
delete(key);
}
--后两种
public void removeAt(int index)
public void clear()
一个是删除指定坐标的数据
一个是清空所有的数据
(3)两种修改数据的方法
public void setValueAt(int index, E value)
public void put(int key, E value)
这里put()方法可能会有疑惑,它不是添加数据的么,怎么也可以修改数据了?
看下put()部分源码:
int i = ContainerHelpers.binarySearch(mKeys, mSize, key);
if (i >= ) {
mValues[i] = value;
} else {
先是查找这个key是不是存在,返回一个整型,如果i>=0,说明存在,直接修改值 ,否则执行else()添加数据
(4)查询获取数据的方法
--获取键对应的值
public E get(int key)
public E get(int key, E valueIfKeyNotFound)
很简单,获取某个键对应的值,两个参数的方法的第二个参数当然就是没有这个key键,返回的默认值
--根据坐标获取该位置的键
public int keyAt(int index)
--根据坐标获取该位置的值
public E valueAt(int index)
----------------------------------------------
--查看键所在的位置
public int indexOfKey(int key)
--查看值所在的位置
public int indexOfValue(E value)
这两个方法返回一个整型数值,往常来说,返回-1代表不存在。
但是这两个方法返回的值不确定,但查询不到的话返回的值还是一个负数。判断是否小于0即可
-------------------------------------------------------------------------------------------------------
相关知识:
SparseArray<E>详解的更多相关文章
- Android 之SparseArray<E>详解
SparseArray是android里为<Interger,Object>这样的Hashmap而专门写的class,目的是提高效率,其核心是折半查找函数(binarySearch) pr ...
- Android编程之SparseArray<E>详解
最近编程时,发现一个针对HashMap<Integer, E>的一个提示: 翻译过来就是:用SparseArray<E>来代替会有更好性能.那我们就来看看源码中SparseAr ...
- 详解ListView加载网络图片的优化,让你轻松掌握!
详解ListView加载网络图片的优化,让你轻松掌握! 写博客辛苦了,转载的朋友请标明出处哦,finddreams(http://blog.csdn.net/finddreams/article/de ...
- Android Telephony分析(三) ---- RILJ详解
前言 本文主要讲解RILJ工作原理,以便更好地分析代码,分析业务的流程.这里说的RILJ指的是RIL.java (frameworks\opt\telephony\src\java\com\andro ...
- 详解 CmProcess 跨进程通信的实现
CmProcess 是 Android 一个跨进程通信框架,整体代码比较简单,总共 20 多个类,能够很好的便于我们去了解跨进程实现的原理. 个人猜测 CmProcess 也是借鉴了 VirtualA ...
- Linq之旅:Linq入门详解(Linq to Objects)
示例代码下载:Linq之旅:Linq入门详解(Linq to Objects) 本博文详细介绍 .NET 3.5 中引入的重要功能:Language Integrated Query(LINQ,语言集 ...
- 架构设计:远程调用服务架构设计及zookeeper技术详解(下篇)
一.下篇开头的废话 终于开写下篇了,这也是我写远程调用框架的第三篇文章,前两篇都被博客园作为[编辑推荐]的文章,很兴奋哦,嘿嘿~~~~,本人是个很臭美的人,一定得要截图为证: 今天是2014年的第一天 ...
- EntityFramework Core 1.1 Add、Attach、Update、Remove方法如何高效使用详解
前言 我比较喜欢安静,大概和我喜欢研究和琢磨技术原因相关吧,刚好到了元旦节,这几天可以好好学习下EF Core,同时在项目当中用到EF Core,借此机会给予比较深入的理解,这里我们只讲解和EF 6. ...
- Java 字符串格式化详解
Java 字符串格式化详解 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 文中如有纰漏,欢迎大家留言指出. 在 Java 的 String 类中,可以使用 format() 方法 ...
随机推荐
- [Git] Git 常用技巧
版本对比 1. 对比两个 COMMIT git diff <commit> <commit> 2. 对比 COMMIT 和父 COMMIT git diff <commi ...
- (转)ubuntu安装opengl
$ sudo apt-get install build-essential 安装OpenGL Library接下来要把我们会用到的 Library 装上去,首先安装 OpenGL Library $ ...
- 编写高质量JS代码的68个有效方法(七)
[20141220]编写高质量JS代码的68个有效方法(七) *:first-child { margin-top: 0 !important; } body>*:last-child { ma ...
- [IR] Boolean retrieval
How to build Inverted Index? 1. Token sequence. 2. Sort by terms. 3. Dictionary & Postings code ...
- es6新特性学习
本文用来记录一下es6的新特性,持续更新.... es6在前端目前还不能大面试使用,包括移动端兼容也不好.不过在node中已可以使用其中96%的特性.也可使用一些插件将es6转化为es5,比如babl ...
- 继续谈论XSS
这篇文章基于上篇谈论XSS ,想说下自己工作过程中遇到的xss的问题. 易出现XSS的场景 1 jsonp 说说jsonp 中也有说过,jsonp其实是很容易出现安全问题的.由于jsonp的callb ...
- 订餐APP第二次sprint+燃尽图
MY-HR 成员: 角色分配 学号 博客园 团队贡献分 围观其他小组评论 丘惠敏 PM项目经理 201406114203 http://www.cnblogs.com/qiuhuimin/ 21 ht ...
- ADO.NET学习系列(三)----做一个登录案例
总体思路.根据用户输入的用户名和密码,来判断,和数据库里面存的是不是一样,如果一样就表明登录成功,否则就登录失败. 方案一: 1.select* from 表名 where username=&quo ...
- linq之where子句
在Linq中,where子句主要是来指定筛选元素的逻辑条件.linq查询中where子句不是必须的,可以不包括where子句,也可以包含多个where子句,where子句中可以包含一个或多个bool类 ...
- sql date()函数
SQL Server Date 函数 下面的表格列出了 SQL Server 中最重要的内建日期函数: 函数 描述 GETDATE() 返回当前的日期和时间 DATEPART() 返回日期/时间的单独 ...