哈希表有兩種實(shí)現(xiàn)方式,一種開放地址方式(Open addressing),另一種是沖突鏈表方式(Separate chaining with linked lists)。
Java7 HashMap采用的是沖突鏈表方式。
從上圖容易看出,如果選擇合適的哈希函數(shù),put()和get()方法可以在常數(shù)時(shí)間內(nèi)完成。但在對(duì)HashMap進(jìn)行迭代時(shí),需要遍歷整個(gè)table以及后面跟的沖突鏈表。因此對(duì)于迭代比較頻繁的場景,不宜將HashMap的初始大小設(shè)的過大。
有兩個(gè)參數(shù)可以影響HashMap的性能: 初始容量(inital capacity)和負(fù)載系數(shù)(load factor)。初始容量指定了初始table的大小,負(fù)載系數(shù)用來指定自動(dòng)擴(kuò)容的臨界值。當(dāng)entry的數(shù)量超過capacity*load_factor時(shí),容器將自動(dòng)擴(kuò)容并重新哈希。對(duì)于插入元素較多的場景,將初始容量設(shè)大可以減少重新哈希的次數(shù)。