SparseArray扩容机制

本文探讨了Android中的SparseArray如何存储数据以及其扩容机制。通过分析`put()`方法和`ContainerHelpers.binarySearch()`,揭示了即使未找到值也会返回最佳插入位置的特点。当需要在已有数值的位置插入新值时,SparseArray会将数组元素后移以进行扩容。文章还提到了`GrowingArrayUtils.insert`方法在扩容过程中的作用,以及`System.arraycopy()`的高效赋值特点。
摘要由CSDN通过智能技术生成

SparseArray指的是稀疏数组,就是数组中并没有填满,只有部分有值,这样造成了内存浪费,往往采用的是压缩的方式来存储内容。

了解下SparseArray怎么存储的以及SparseArray的扩容。

看下代码

public class SparseArray<E> implements Cloneable {

//内部是两个数组,一个用来存储key值得映射,一个用来存储value
  	private int[] mKeys; 	
    private Object[] mValues;
    private int mSize;


    public SparseArray() {
        this(10);
    }
    public SparseArray(int initialCapacity) {
        if (initialCapacity == 0) {
            mKeys = EmptyArray.INT;
            mValues = EmptyArray.OBJECT;
        } else {
            mValues = ArrayUtils.newUnpaddedObjectArray(initialCapacity);
            mKeys = new int[mValues.length];
        }
        mSize = 0;
    }

看下put()方法

   public void put(int key, E value) {
       //二分搜索,查找当前Key值在数组中的位置,这个二分查找挺有意思的
        int i = ContainerHelpers.binarySearch(mKeys, mSize, key);
        //如果当前值不是负数,说明key值在数组中的映射存在,直接覆盖就行
        if (i >= 0) {
            mValues[i] = value;
        } else {//如果是负数,说明key值得映射不存在,需要新添加
        //这里为什么要取反?是因为通过上面的二分查找在mKeys中没有找到对应的key值,
        //二分查找会返回一个最佳位置,
        //这个最佳位置是取反过的,是一个负数,这里再次取反其实是还原了位置i。
            i = ~i; 	
            
		//如果key值要映射的最佳位置是小于mSize,并且当前位置的值没有被填充,那直接赋值就行。
            if (i <
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值