ThreadLocalMap(ThreadLocal<?> firstKey, Object firstValue) {
table = new Entry[INITIAL_CAPACITY];
int i = firstKey.threadLocalHashCode & (INITIAL_CAPACITY - 1);
table[i] = new Entry(firstKey, firstValue);
size = 1;
setThreshold(INITIAL_CAPACITY);
}
取模(求余)運(yùn)算
在threadlocal中有一句int i = firstKey.threadLocalHashCode & (INITIAL_CAPACITY - 1);
這里的位運(yùn)算的實(shí)質(zhì)是去一個(gè)取模(求余)運(yùn)算恭取,決定一個(gè)key應(yīng)該放在數(shù)組的哪個(gè)index上泰偿。
當(dāng)取模運(yùn)算中秽荤,除數(shù)是2的N次方時(shí),既這個(gè)數(shù)用二進(jìn)制表示的時(shí)候一定只有一個(gè)1窃款,比如16,在java的Integer中的2進(jìn)制實(shí)質(zhì)就是
000000000000000000000000000010000
減一就是
000000000000000000000000000001111
與被除數(shù)做與運(yùn)算晨继,被除數(shù)剛好高位就被消除,只剩下低位紊扬。既比除數(shù)大,但沒有超過一倍的部分被保留餐屎。這剛好是取模(求余)運(yùn)算。
之所以這么做屿聋,是因?yàn)槲贿\(yùn)算的效率要遠(yuǎn)高于普通的取模運(yùn)算。
為什么要用0x61c88647
這個(gè)數(shù)是Integer有符號整數(shù)的0.618倍润讥,既黃金比例,斐波拉契數(shù)列楚殿。
使用這個(gè)比例竿痰,可以使key在數(shù)組上被更均勻的分散脆粥。至于為什么,是一個(gè)復(fù)雜的數(shù)學(xué)問題变隔。不懂,不展開討論。