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即可

-------------------------------------------------------------------------------------------------------

相关知识:

Java集合框架

SparseArray<E>详解的更多相关文章

  1. Android 之SparseArray<E>详解

    SparseArray是android里为<Interger,Object>这样的Hashmap而专门写的class,目的是提高效率,其核心是折半查找函数(binarySearch) pr ...

  2. Android编程之SparseArray<E>详解

    最近编程时,发现一个针对HashMap<Integer, E>的一个提示: 翻译过来就是:用SparseArray<E>来代替会有更好性能.那我们就来看看源码中SparseAr ...

  3. 详解ListView加载网络图片的优化,让你轻松掌握!

    详解ListView加载网络图片的优化,让你轻松掌握! 写博客辛苦了,转载的朋友请标明出处哦,finddreams(http://blog.csdn.net/finddreams/article/de ...

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

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

  5. 详解 CmProcess 跨进程通信的实现

    CmProcess 是 Android 一个跨进程通信框架,整体代码比较简单,总共 20 多个类,能够很好的便于我们去了解跨进程实现的原理. 个人猜测 CmProcess 也是借鉴了 VirtualA ...

  6. Linq之旅:Linq入门详解(Linq to Objects)

    示例代码下载:Linq之旅:Linq入门详解(Linq to Objects) 本博文详细介绍 .NET 3.5 中引入的重要功能:Language Integrated Query(LINQ,语言集 ...

  7. 架构设计:远程调用服务架构设计及zookeeper技术详解(下篇)

    一.下篇开头的废话 终于开写下篇了,这也是我写远程调用框架的第三篇文章,前两篇都被博客园作为[编辑推荐]的文章,很兴奋哦,嘿嘿~~~~,本人是个很臭美的人,一定得要截图为证: 今天是2014年的第一天 ...

  8. EntityFramework Core 1.1 Add、Attach、Update、Remove方法如何高效使用详解

    前言 我比较喜欢安静,大概和我喜欢研究和琢磨技术原因相关吧,刚好到了元旦节,这几天可以好好学习下EF Core,同时在项目当中用到EF Core,借此机会给予比较深入的理解,这里我们只讲解和EF 6. ...

  9. Java 字符串格式化详解

    Java 字符串格式化详解 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 文中如有纰漏,欢迎大家留言指出. 在 Java 的 String 类中,可以使用 format() 方法 ...

随机推荐

  1. XPS 15 9530使用Windows10频繁发生Intel HD Graphics 4600驱动奔溃的一种解决方法

    本人使用XPS 15 9530.集成显卡为Intel HD Graphics 4600.操作系统Windows 10 Pro,使用过程当中经常会发生集成显卡奔溃的问题,错误提示如下: Display ...

  2. Ubuntu主题美化--使用WPS风格

    五一就这么过去了,我也没有出去玩,一个人闲的蛋疼,无聊就把ubuntu美化一下. 闲话不多说,先看效果: 壁纸是我自己制作的的,如果喜欢另存一下下面这张图设置成背景就可以了,分辨率是1366x768. ...

  3. Entityframework 事务

    Working with Transactions (EF6 Onwards) This document will describe using transactions in EF6 includ ...

  4. 什么是作用域链,什么是原型链,它们的区别,在js中它们具体指什么?

    什么是作用域链,什么是原型链. 作用域是针对变量的,比如我们创建了一个函数,函数里面又包含了一个函数,那么现在就有三个作用域 全局作用域==>函数1作用域==>函数2作用域 作用域的特点就 ...

  5. EditorWindow中手动控制焦点

    在Unity3D中制作编辑器的时候,有时候会需要手动控制界面上控件的焦点,与此相关的有三个函数都在下面的示例代码中了: public void Test() { // 给控件命名 GUI.SetNex ...

  6. Adroid学习系列-入门(1)

    1.  安装 安装Eclipse,安装Adroid插件.安装Adroid SDK. 2.  项目目录说明 2.1.       建立Adroid项目 与一般的Java项目一样 )src文件夹是项目的所 ...

  7. Tips1:用 Export Package选项来分享你的成果

    如果你不是一个人工作,你可能需要和其他人共享一个工程文件,Unity工程文件中的一些关键元素默认是隐藏的,因此通过复制Assets文件夹的方法并不完善.Unity自带的UnityPackage格式的文 ...

  8. 【转载】SHELL字符串处理技巧(${}、##、%%)

    转载自:http://www.cnblogs.com/pmars/archive/2013/02/17/2914444.html 在SHELL编程中,经常要处理一些字符串变量.比如,计算长度啊.截取子 ...

  9. 专门为码农定制的14款创意的T裇(T-Shirt)设计

    T裇衫是人们在各种场合都可穿着的服装,如在T裇衫上作适当的装饰,即可增添无穷的韵味.通过图案直接反映人类的精神风貌,你可以把日常生活中的兴趣.习惯.喜怒哀乐.嗜好等展露无疑,张扬个性.秀出自我.对于码 ...

  10. 用cart(分类回归树)作为弱分类器实现adaboost

    在之前的决策树到集成学习里我们说了决策树和集成学习的基本概念(用了adaboost昨晚集成学习的例子),其后我们分别学习了决策树分类原理和adaboost原理和实现, 上两篇我们学习了cart(决策分 ...