SparseArray详解

时间:2025-05-16 10:08:02

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集合框架