HashMap 中hash table 定位算法:
其中indexFor和hash源碼如下:
indexFor這個方法論壇中已有人分析過,,這里就不再分析,。 現(xiàn)在分析一下hash算法:
假設(shè)key.hashCode()的值為:0x7FFFFFFF,table.length為默認值16,。 上面算法執(zhí)行如下: 得到i=15 其中h^(h>>>7)^(h>>>4) 結(jié)果中的位運行標識是把h>>>7 換成 h>>>8來看,。 即最后h^(h>>>8)^(h>>>4) 運算后hashCode值每位數(shù)值如下: 8=8 7=7^8 6=6^7^8 5=5^8^7^6 4=4^7^6^5^8 3=3^8^6^5^8^4^7 2=2^7^5^4^7^3^8^6 1=1^6^4^3^8^6^2^7^5 結(jié)果中的1、2,、3三位出現(xiàn)重復(fù)位^運算 3=3^8^6^5^8^4^7 -> 3^6^5^4^7 2=2^7^5^4^7^3^8^6 -> 2^5^4^3^8^6 1=1^6^4^3^8^6^2^7^5 -> 1^4^3^8^2^7^5 算法中是采用(h>>>7)而不是(h>>>8)的算法,,應(yīng)該是考慮1、2,、3三位出現(xiàn)重復(fù)位^運算的情況,。使得最低位上原h(huán)ashCode的8位都參與了^運算,所以在table.length為默認值16的情況下面,,hashCode任意位的變化基本都能反應(yīng)到最終hash table 定位算法中,,這種情況下只有原h(huán)ashCode第3位高1位變化不會反應(yīng)到結(jié)果中,,即:0x7FFFF7FF的i=15。 |
|