HashMap和Hashtable的比較是Java面試中的常見問題,主要用來考研程序員是否可以正確使用集合類以及是否能夠隨機應變使用多種思路解決問題。程序員
前不久面試時正好也被問到了這個問題,今天忽然想起來了,索性就整理一下,寫個總結。面試
HashMap和Hashtable都實現了Map 接口,可是具體要使用哪個,須要先了解它們存在怎樣的區別,而後再根據具體的狀況作出選擇。安全
一、線程安全性性能
首先,HashMap是非synchronized的,而Hashtable是synchronized的。這說明Hashtable是線程安全的,並且多個線程能夠共享一個Hashtable;spa
而HashMap若是沒有正確的同步的話,是不能被多個線程所共享的。可是,Java 5中爲咱們提供了ConcurrentHashMap,它是Hashtable的替線程
代,並且比Hashtable的擴展性更好。code
其次,HashMap的迭代器(Iterator)是fail-fast迭代器,而Hashtable的迭代器(enumerator)卻不是fail-fast的。所以,當有其它線程改變了對象
HashMap的結構(刪除或插入新的元素一個),將會拋出ConcurrentModificationException異常,可是迭代器自己的remove()方法移除元素或者其blog
它線程經過set()方法更改集合對象是容許的(可是,若是已經從結構上進行了修改,在調用set()方法,將會拋出IllegalArgumentException異常),接口
由於這並無更改集合的「結構」。然而,這並非一個必定會發生的行爲,要看JVM。固然這個行爲也是Enumeration和Iterator的區別。
二、同步和速度
因爲Hashtable是線程安全的,也是synchronized的,因此在單線程環境下比HashMap要慢。若是你不須要同步且只須要單一線程的話,那麼使用
HashMap性能要比Hashtable好一些。此時,HashMap是個不錯的選擇。
三、容納數據
HashMap幾乎能夠等價於Hashtable,除了HashMap是非synchronized的,並能夠接受null值(HashMap能夠存在null的鍵值(key)和值(value),
可是Hashtable是不能夠的)。
四、次序
HashMap不能保證隨着時間的推移Map中的元素次序是不變的。要保持元素順序不變,除非是LinkedHashMap。
注:如何實現HashMap的同步呢?
1 HashMap hashMap = new HashMap(); 2 Map map = Collections.synchronizeMap(hashMap);
總結
一、HashMap和Hashtable的主要區別在於:線程安全和速度。
二、儘可能只在你須要徹底的線程安全的時候選擇使用Hashtable。
三、若是你使用的是Java 5+的話,儘可能使用ConcurrentHashMap。