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