Java基礎(chǔ)-ThreadLocal中的中哈希算法0x61c88647

 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有符號(hào)整數(shù)的0.618倍,既黃金比例,斐波拉契數(shù)列。
使用這個(gè)比例,可以使key在數(shù)組上被更均勻的分散。至于為什么,是一個(gè)復(fù)雜的數(shù)學(xué)問題。不懂,不展開討論。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容