SparseArray容量初始大小到底是多少?

以Android4.3的源码分析SparseArray的容量初始值到底是多少

    //无参构造函数
    public SparseArray() {
       //这里无参构造函数调用有参构造函数
        this(10);
    }

紧接着

 //有参构造函数
 public SparseArray(int initialCapacity) {
        //决定它初始容量的关键代码就是下边这行
        initialCapacity = ArrayUtils.idealIntArraySize(initialCapacity);
        mKeys = new int[initialCapacity];
        mValues = new Object[initialCapacity];
        mSize = 0;
    }

紧接着看ArrayUtils.idealIntArraySize(initialCapacity);这里边到底做了什么

public class ArrayUtils{
  private ArrayUtils() { /* cannot be instantiated */ }
    //我写的注释已经很明确,这个for循环只有当1左移6位=64时
    public static int idealByteArraySize(int need) {
        //need= 40
        for (int i = 4; i < 32; i++)
            //if(40<=(1<<6=64)-12)成立
            if (need <= (1 << i) - 12)
                //1<<6=64-12=52 所以这里初始化的时候返回的值是52
                return (1 << i) - 12;
        return need;
    }

    public static int idealBooleanArraySize(int need) {
        return idealByteArraySize(need);
    }

    public static int idealShortArraySize(int need) {
        return idealByteArraySize(need * 2) / 2;
    }

    public static int idealCharArraySize(int need) {
        return idealByteArraySize(need * 2) / 2;
    }
    //我们需要看的是这个方法,其他忽略
    public static int idealIntArraySize(int need) {
        //idealByteArraySize(10 * 4=40)=52/4=13写的已经够清楚了吧
        return idealByteArraySize(need * 4) / 4;
    }

    public static int idealFloatArraySize(int need) {
        return idealByteArraySize(need * 4) / 4;
    }

    public static int idealObjectArraySize(int need) {
        return idealByteArraySize(need * 4) / 4;
    }

    public static int idealLongArraySize(int need) {
        return idealByteArraySize(need * 8) / 8;
    }

}

所以得出结论SparseArray两个数组(初始容量大小是13,13,13),不是10,不是10,不是10,说三遍,不要让那些送资料的,骗关注的忽悠了,还是要自己看源码,自己去求证

你可能感兴趣的:(SparseArray容量初始大小到底是多少?)