在Java中,保存數(shù)據(jù)有兩種比較簡單的數(shù)據(jù)結(jié)構(gòu):數(shù)組和鏈表。
數(shù)組的特點(diǎn)是:尋址容易,插入和刪除困難;鏈表的特點(diǎn)是:尋址困難,但插入和刪除容易;
所以我們將數(shù)組和鏈表結(jié)合在一起,發(fā)揮兩者各自的優(yōu)勢,就可以使用倆種方式:鏈地址法和開放地址法可以解決哈希沖突:
鏈表法就是將相同hash值的對象組織成一個(gè)鏈表放在hash值對應(yīng)的槽位;
開放地址法是通過一個(gè)探測算法,當(dāng)某個(gè)槽位已經(jīng)被占據(jù)的情況下繼續(xù)查找下一個(gè)可以使用的槽位。
但相比于hashCode返回的int類型,我們HashMap初始的容量大小DEFAULT_INITIAL_CAPACITY = 1 << 4(即2的四次方16)要遠(yuǎn)小于int類型的范圍,所以我們?nèi)绻皇菃渭兊挠胔ashCode取余來獲取對應(yīng)的bucket這將會(huì)大大增加哈希碰撞的概率,并且最壞情況下還會(huì)將HashMap變成一個(gè)單鏈表,所以我們還需要對hashCode作一定的優(yōu)化