zoukankan      html  css  js  c++  java
  • SparseArray<E>详解

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

  • 相关阅读:
    拒绝喝酒理由1
    动态调用事件,事件的方法
    c#发送图片
    c#截屏功能的实现
    devexpress中文讨论论坛
    解析javascript变量
    devexpress_PivotGrid说明
    python学习之老男孩python全栈第九期_day022知识点总结——初识面向对象
    python学习之老男孩python全栈第九期_day022作业
    员工信息表
  • 原文地址:https://www.cnblogs.com/xqxacm/p/5082238.html
Copyright © 2011-2022 走看看