SparseArray 是 Android 提供的稀疏数组实现,用两个并行数组(int[] + Object[])替代 HashMapInteger, Object,避免 Integer 对象的自动装箱开销。一、核心数据结构// android.util.SparseArraypublicclassSparseArrayEimplementsCloneable{// 存储 key(int 类型,不装箱)privateint[]mKeys;// 存储 value(Object 类型)privateObject[]mValues;// 实际元素个数privateintmSize;// 默认初始容量privatestaticfinalObjectDELETED=newObject();// 删除标记}内存结构:二、核心方法源码put — 插入/更新publicvoidput(intkey,Evalue){// 1. 二分查找 key 的位置inti=ContainerHelpers.binarySearch(mKeys,mSize,key);if(i=0){// 找到相同 key,更新 valuemValues[i]=value;}else{// 没找到,i = ~insertionPoint(取反后的插入位置)i=~i;// 如果插入位置已被标记删除,直接复用if(imSizemValues[i]==DELETED){mKeys[i]=key;mValues[i]=value;return;}// 如果需要扩容if(mSize=mKeys.length){growKeyAndValueArrays(mSize+1);// 扩容后重新二分查找(因为数组变了)i=~ContainerHelpers.binarySearch(mKeys,mSize,key);}// 插入位置后的元素右移System.arraycopy(mKeys,i,mKeys,i+1,mSize-i);System.arraycopy(mValues,i,mValues,i+1,mSize-i);mKeys[i]=key;mValues[i]=value;mSize++;}}get — 查找publicEget(intkey,EvalueIfKeyNotFound){// 二分查找inti=ContainerHelpers.binarySearch(mKeys,/
Android随笔-SparseArray
SparseArray 是 Android 提供的稀疏数组实现,用两个并行数组(int[] + Object[])替代 HashMapInteger, Object,避免 Integer 对象的自动装箱开销。一、核心数据结构// android.util.SparseArraypublicclassSparseArrayEimplementsCloneable{// 存储 key(int 类型,不装箱)privateint[]mKeys;// 存储 value(Object 类型)privateObject[]mValues;// 实际元素个数privateintmSize;// 默认初始容量privatestaticfinalObjectDELETED=newObject();// 删除标记}内存结构:二、核心方法源码put — 插入/更新publicvoidput(intkey,Evalue){// 1. 二分查找 key 的位置inti=ContainerHelpers.binarySearch(mKeys,mSize,key);if(i=0){// 找到相同 key,更新 valuemValues[i]=value;}else{// 没找到,i = ~insertionPoint(取反后的插入位置)i=~i;// 如果插入位置已被标记删除,直接复用if(imSizemValues[i]==DELETED){mKeys[i]=key;mValues[i]=value;return;}// 如果需要扩容if(mSize=mKeys.length){growKeyAndValueArrays(mSize+1);// 扩容后重新二分查找(因为数组变了)i=~ContainerHelpers.binarySearch(mKeys,mSize,key);}// 插入位置后的元素右移System.arraycopy(mKeys,i,mKeys,i+1,mSize-i);System.arraycopy(mValues,i,mValues,i+1,mSize-i);mKeys[i]=key;mValues[i]=value;mSize++;}}get — 查找publicEget(intkey,EvalueIfKeyNotFound){// 二分查找inti=ContainerHelpers.binarySearch(mKeys,/