博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SparseArray<E>详解
阅读量:6437 次
发布时间:2019-06-23

本文共 2258 字,大约阅读时间需要 7 分钟。

SparseArray<E> 是官方推荐的用来替代 HashMap<Integer, E> 的一个工具类,相比来说有着更好的性能(其核心是折半查找函数(binarySearch))。

通过源码来看下SparseArray<E>的一些使用特点:

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

1、SparseArray可以预先设置容器大小,默认是10

/**     * Creates a new SparseArray containing no mappings.     */    public SparseArray() {        this(10);    }

 

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

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 = 0;        int hi = size - 1;        while (lo <= hi) {            final int mid = (lo + hi) >>> 1;            final int midVal = array[mid];            if (midVal < value) {                lo = mid + 1;            } else if (midVal > value) {                hi = mid - 1;            } 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 >= 0) {            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即可

 

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

相关知识:

 

转载地址:http://tqkwo.baihongyu.com/

你可能感兴趣的文章
STP生成树算法
查看>>
nginx常用配置
查看>>
英语考试(最小生成树)
查看>>
JS数组操作
查看>>
设置组件局部样式原理-属性选择器
查看>>
慕课-北京理工大学 机器学习 大学生上网时间 聚类,小白学习
查看>>
实用算法实现-第6篇 线段树
查看>>
webclientt和httpwebrequest
查看>>
第一个C#控制台程序
查看>>
python练习---购物车
查看>>
[C++基础]025_虚函数和虚函数表
查看>>
ARC的原理详解
查看>>
php代码审计基础笔记
查看>>
hdu1160 dp
查看>>
java服务器端编程
查看>>
JavaScript 语言基础知识点图示
查看>>
linux清理缓存的命令
查看>>
jsoup的介绍使用(转)
查看>>
ES6之拷贝对象
查看>>
new delete malloc free
查看>>