Java中的HashMap和Hashtable都是存儲(chǔ)鍵值對的數(shù)據(jù)結(jié)構(gòu),可以通過鍵來查找對應(yīng)的值。它們的主要區(qū)別在于線程安全和性能。
1. Hashtable
Hashtable是線程安全的,因?yàn)樗姆椒ǘ际峭降模词褂昧藄ynchronized關(guān)鍵字)。雖然這確保了多線程情況下的安全性,但也導(dǎo)致了性能上的降低。Hashtable不允許null值作為鍵或值,因?yàn)樗鼈儾恢С謓ull對象。取代它們的是一個(gè)稱為NullObject的特殊對象。Hashtable在initialCapacity被滿時(shí)會(huì)自動(dòng)rehash,但是不能控制rehash的負(fù)載因子。Hashtable的迭代器是fail-fast的,會(huì)拋出ConcurrentModificationException。
2. HashMap
HashMap不是線程安全的,但是它的性能比Hashtable更好。它允許null值作為鍵或值。HashMap在initialCapacity被滿時(shí)會(huì)自動(dòng)rehash,并且可以通過loadFactor參數(shù)控制rehash的負(fù)載因子。HashMap的迭代器是fail-fast的,也會(huì)拋出ConcurrentModificationException。
因此,在單線程環(huán)境下,建議使用HashMap,而在多線程環(huán)境下,建議使用Hashtable或者ConcurrentHashMap。