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