面試題·HashMap和Hashtable的區別(轉載再整理)

原文連接: Javarevisited 翻譯: ImportNew.com - 唐小娟
譯文連接: http://www.importnew.com/7010...

HashMap和Hashtable的比較是Java面試中的常見問題,用來考驗程序員是否可以正確使用集合類以及是否能夠隨機應變使用多種思路解決問題。HashMap的工做原理、ArrayList與Vector的比較以及這個問題是有關Java 集合框架的最經典的問題。Hashtable是個過期的集合類,存在於Java API中好久了。在Java 4中被重寫了,實現了Map接口,因此自此之後也成了Java集合框架中的一部分。Hashtable和HashMap在Java面試中至關容易被問到,甚至成爲了集合框架面試題中最常被考的問題,因此在參加任何Java面試以前,都不要忘了準備這一題。html

這篇文章中,咱們不只將會看到HashMap和Hashtable的區別,還將看到它們之間的類似之處。java

HashMap和Hashtable的區別

HashMap和Hashtable都實現了Map接口,但決定用哪個以前先要弄清楚它們之間的分別。主要的區別有:線程安全性,同步(synchronization),以及速度。程序員

  1. HashMap幾乎能夠等價於Hashtable,除了HashMap是非synchronized的,並能夠接受null(HashMap能夠接受爲null的鍵值(key)和值(value),而Hashtable則不行)。
  2. HashMap是非synchronized,而Hashtable是synchronized,這意味着Hashtable是線程安全的,多個線程能夠共享一個Hashtable;而若是沒有正確的同步的話,多個線程是不能共享HashMap的。Java 5提供了ConcurrentHashMap,它是HashTable的替代,比HashTable的擴展性更好。
  3. 另外一個區別是HashMap的迭代器(Iterator)是fail-fast迭代器,而Hashtable的enumerator迭代器不是fail-fast的。因此當有其它線程改變了HashMap的結構(增長或者移除元素),將會拋出ConcurrentModificationException,但迭代器自己的remove()方法移除元素則不會拋出ConcurrentModificationException異常。但這並非一個必定發生的行爲,要看JVM。這條一樣也是Enumeration和Iterator的區別。
  4. 因爲Hashtable是線程安全的也是synchronized,因此在單線程環境下它比HashMap要慢。若是你不須要同步,只須要單一線程,那麼使用HashMap性能要好過Hashtable。
  5. HashMap不能保證隨着時間的推移Map中的元素次序是不變的。

要注意的一些重要術語:

  1. sychronized意味着在一次僅有一個線程可以更改Hashtable。就是說任何線程要更新Hashtable時要首先得到同步鎖,其它線程要等到同步鎖被釋放以後才能再次得到同步鎖更新Hashtable。
  2. Fail-safe和iterator迭代器相關。若是某個集合對象建立了Iterator或者ListIterator,而後其它的線程試圖「結構上」更改集合對象,將會拋出ConcurrentModificationException異常。但其它線程能夠經過set()方法更改集合對象是容許的,由於這並無從「結構上」更改集合。可是假如已經從結構上進行了更改,再調用set()方法,將會拋出IllegalArgumentException異常。
  3. 結構上的更改指的是刪除或者插入一個元素,這樣會影響到map的結構。

咱們可否讓HashMap同步?

HashMap能夠經過下面的語句進行同步:
Map m = Collections.synchronizeMap(hashMap);面試

結論

Hashtable和HashMap有幾個主要的不一樣:線程安全以及速度。僅在你須要徹底的線程安全的時候使用Hashtable,Hashtable是java 4時代的過期產物,ConcurrentHashMap是它的替代品。而若是你使用Java 5或以上的話,請使用ConcurrentHashMap吧。安全

相關文章
相關標籤/搜索