HashMap和Hashtable都實現(xiàn)了Map接口售躁,但決定用哪一個之前先要弄清楚它們之間的區(qū)別。主要的區(qū)別有:線程安全性,同步(synchronization)韭赘,以及速度。
- HashMap幾乎等價于Hashtable势就,除了HashMap是非synchronized的泉瞻,并可以接受null(HashMap可以接受為null的鍵值(key)和值(value)楷怒,而hashtable則不行)。
- HashMap是非synchronized瓦灶,而Hashtable是synchronized鸠删,這意味著Hashtable是線程安全的,多個線程可以共享一個Hashtable贼陶;而如果沒有正確的同步的話刃泡,多個線程是不能共享HashMap的。Java 5提供了ConcurrentHashMap碉怔,它是Hashtable的替代烘贴,比HashTable的擴(kuò)展性更好。
- 另一個區(qū)別是HashMap的迭代器(Iterator)是fail-fast迭代器撮胧,而Hashtable的enumerator迭代器不是fail-fast桨踪。所以當(dāng)有其他線程改變了HashMap的結(jié)構(gòu)(增加或者移除元素),將會拋出ConcurrentModificationException芹啥,但迭代器本身的remove()方法移除元素則不會拋出ConcurrentModificationException異常锻离,但這并不是一個一定發(fā)生的行為,要看JVM墓怀。這條同樣也是Enumeration和Iterator的區(qū)別汽纠。
- 由于Hashtable是線程安全的也是synchronized,所以在單線程環(huán)境下它比HashMap要慢傀履。如果你不需要同步虱朵,只需要單一線程,那么使用HashMap性能要好過Hashtable钓账。
- HashMap不能保證隨著時間的推移Map中的元素次序是不會變的碴犬。
結(jié)論
Hashtable和HashMap有幾個主要的不同:線程安全以及速度。僅在你需要完全的線程安全的時候使用Hashtable梆暮,而如果你使用java 5或以上的話服协,請使用ConcurrentHashMap吧。