SparseArray<E>详解

简介: SparseArray 是官方推荐的用来替代 HashMap 的一个工具类,相比来说有着更好的性能(其核心是折半查找函数(binarySearch))。 通过源码来看下SparseArray的一些使用特点: --------------------------------------------...

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

 

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

相关知识:

Java集合框架

 

相关文章
|
5月前
|
JavaScript 前端开发 API
URLSearchParams
【6月更文挑战第4天】
34 1
|
6月前
parseInt和parseFloat
parseInt和parseFloat
29 0
Comparable与Comparator对象比较
Comparable与Comparator对象比较
56 0
|
JavaScript 前端开发 索引
[‘1‘, ‘2‘, ‘3‘].map(parseInt)
[‘1‘, ‘2‘, ‘3‘].map(parseInt)
113 0
[‘1‘, ‘2‘, ‘3‘].map(parseInt)
java86-Interage方法compareto,parseint,intvalue
java86-Interage方法compareto,parseint,intvalue
113 0
java86-Interage方法compareto,parseint,intvalue
|
JSON Java 数据格式
Java - JSON 之 parse & parseObject & parseArray 区别
Java - JSON 之 parse & parseObject & parseArray 区别
277 0
|
JavaScript 前端开发
parseInt原来是这样用的
原文:parseInt原来是这样用的   今天在群里无意中看到了这样一个问题,突然发现不会,结果运行一看,懵逼了,不知道为什么???(结果是啥?自己去试试看)        现在我们还是先来复习一下parseInt()这个知识点吧!      parseInt() 函数可解析一个字符串,并返回一个整数。
763 0