關(guān)于編程中HashMap和HashTable的選擇問題,我們可以先看看下面這些問題,。 歷史問題Hashtable是個(gè)過時(shí)的集合類,,是基于陳舊的Dictionary類的,并且存在于Java API中很久了,。在Java 4中被重寫了,,實(shí)現(xiàn)了Map接口,所以自此以后也成了Java集合框架中的一部分,,而HashMap是Java 1.2引進(jìn)的Map接口的一個(gè)實(shí)現(xiàn),。 同步問題HashMap是非synchronized,而Hashtable是synchronized,,這意味著Hashtable是線程安全的,,多個(gè)線程可以共享一個(gè)Hashtable;而如果沒有正確的同步的話,,多個(gè)線程是不能共享HashMap的,。Java 5提供了ConcurrentHashMap,它是HashTable的替代,,比HashTable的擴(kuò)展性更好,。 迭代問題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ū)別。 key值問題HashMap可以讓你將空值作為一個(gè)表的條目的key或value,。HashMap中只有一條記錄可以是一個(gè)空的key,,但任意數(shù)量的條目可以是空的value。這就是說,,如果在表中沒有發(fā)現(xiàn)搜索鍵,,或者如果發(fā)現(xiàn)了搜索鍵,但它是一個(gè)空的值,,那么get()將返回null,。如果有必要,用containKey()方法來區(qū)別這兩種情況,。 效率問題由于Hashtable是線程安全的也是synchronized,,所以在單線程環(huán)境下它比HashMap要慢。如果你不需要同步,,只需要單一線程,,那么使用HashMap性能要好過Hashtable。 元素順序HashMap不能保證隨著時(shí)間的推移Map中的元素次序是不變的,。 HashMap同步HashMap可以通過下面的語句進(jìn)行同步: 術(shù)語解釋sychronizedsychronized意味著在一次僅有一個(gè)線程能夠更改Hashtable,。就是說任何線程要更新Hashtable時(shí)要首先獲得同步鎖,其它線程要等到同步鎖被釋放之后才能再次獲得同步鎖更新Hashtable,。 fail-fast and fail-safe關(guān)于fail-fast and fail-safe,,可以參考這篇文章Fail Fast vs Fail Safe 總結(jié)在目前的編程中基本上可以不用HashTable了,在不要求線程安全的情況下直接使用HashMap,,效率比較高;如果,,要求線程安全,,則使用ConcurrentHashMap來代替HashMap。 參考
|
|