HashMap的工作原理、ArrayList與Vector的比較以及這個(gè)問題是有關(guān)Java 集合框架的最經(jīng)典的問題。Hashtable是個(gè)過時(shí)的集合類刁俭,存在于Java API中很久了。在Java 4中被重寫了,實(shí)現(xiàn)了Map接口舅锄,所以自此以后也成了Java集合框架中的一部分。
區(qū)別兩者的不同司忱。主要從線程的安全皇忿,以及速度。來判斷
1.HashMap幾乎可以等價(jià)于Hashtable坦仍,除了HashMap是非synchronized的鳍烁,并可以接受null(HashMap可以接受為null的鍵值(key)和值(value),而Hashtable則不行)繁扎。
2.HashMap是非synchronized幔荒,而Hashtable是synchronized,這意味著Hashtable是線程安全的梳玫,多個(gè)線程可以共享一個(gè)Hashtable爹梁;而如果沒有正確的同步的話,多個(gè)線程是不能共享HashMap的提澎。Java 5提供了ConcurrentHashMap姚垃,它是HashTable的替代,比HashTable的擴(kuò)展性更好盼忌。
3.另一個(gè)區(qū)別是HashMap的迭代器(Iterator)是fail-fast迭代器积糯,而Hashtable的enumerator迭代器不是fail-fast的。所以當(dāng)有其它線程改變了HashMap的結(jié)構(gòu)(增加或者移除元素)谦纱,將會(huì)拋出ConcurrentModificationException看成,但迭代器本身的remove()方法移除元素則不會(huì)拋出ConcurrentModificationException。這并不是一個(gè)一定發(fā)生的行為跨嘉,要看JVM川慌。這條同樣也是Enumeration和Iterator的區(qū)別。
4. 由于Hashtable是線程安全的也是synchronized祠乃,所以在單線程環(huán)境下它比HashMap要慢梦重。如果你不需要同步,只需要單一線程跳纳,那么使用HashMap性能要好過Hashtable忍饰。
我們能否讓HashMap同步?
Map m = Collections.synchronizeMap(hashMap);
結(jié)論