以Android4.3的源碼分析SparseArray的容量初始值到底是多少
//無參構(gòu)造函數(shù)
public SparseArray() {
//這里無參構(gòu)造函數(shù)調(diào)用有參構(gòu)造函數(shù)
this(10);
}
緊接著
//有參構(gòu)造函數(shù)
public SparseArray(int initialCapacity) {
//決定它初始容量的關(guān)鍵代碼就是下邊這行
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 */ }
//我寫的注釋已經(jīng)很明確,這個(gè)for循環(huán)只有當(dāng)1左移6位=64時(shí)
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 所以這里初始化的時(shí)候返回的值是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;
}
//我們需要看的是這個(gè)方法逮壁,其他忽略
public static int idealIntArraySize(int need) {
//idealByteArraySize(10 * 4=40)=52/4=13寫的已經(jīng)夠清楚了吧
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;
}
}