Java中HashMap和Hashtable有什麼區別

Java中HashMap與Hashtable的區別

HashMap和Hashtable都實現了Map接口,可是在決定在Java中是否使用HashMap或Hashtable以前,它們之間有一些重要的區別,這一點很重要。其中一些是線程安全、同步和速度。如下是這些不一樣之處:安全

1.HashMap類大體至關於哈希表,但它是非同步的,而且容許空值。(HashMap容許空值做爲鍵和值,而哈希表不容許空)。併發

2.主要之一HashMap與Hashtable的區別是HashMap是非同步的,而Hashtable是同步的,這意味着哈希表線程安全,能夠在多個線程之間共享,可是HashMap若是沒有適當的同步,就不能在多個線程之間共享。Java 5介紹ConcurrentHashMap它是Hashtable的另外一種選擇,它提供了比Java中的Hashtable更好的可伸縮性。
 ide

HashMap vs Hashtable in Java

 

3.HashMap和Hashtable之間的另外一個顯著區別是,HashMap中的迭代器是失敗快速迭代器,而Hashtable的枚舉器不是,若是任何其餘線程經過添加或刪除Iterator本身的remove()方法以外的任何元素在結構上修改映射,則拋出ConcurrentModificationException。可是這不是一種有保證的行爲,JVM將盡最大努力來完成。這也是Java中枚舉和迭代器之間的一個重要區別。性能

4. Hashtable和HashMap之間一個更顯著的區別是,因爲線程安全性和同步性,若是在單線程環境中使用,Hashtable比HashMap慢得多。所以,若是您不須要同步,而且HashMap僅由一個線程使用,那麼它的性能將優於Java中的Hashtable。線程

5. HashMap不能保證映射的順序在一段時間內保持不變。對象

HashMap和Hashtable:關於一些重要術語的說明

1)Synchronized是指在一個時間點上只有一個線程能夠修改哈希表。基本上,這意味着在對哈希表執行更新以前,任何線程都必須得到對象上的鎖,而其餘線程將等待該鎖被釋放。接口

2)故障安全與迭代器的上下文相關。若是在集合對象上建立了迭代器或ListIterator,而其餘線程試圖「結構化地」修改集合對象,則會引起併發修改異常。不過,其餘線程也能夠調用「set」方法,由於它不會「在結構上」修改集合。可是,若是在調用「set」以前在結構上修改了集合,則會拋出「IllegalArgumentException」。rem

Difference between HashMap and Hashtable in Java

3)結構修改是指刪除或插入能夠有效改變地圖結構的元素。同步

HashMap能夠經過如下方式同步hash

Map m = Collections.synchronizeMap(hashMap);

總之,Hashtable和HashMap在Java中有很大的區別,例如線程安全性和速度,而且只有在絕對須要線程安全性(若是運行Java 5)的狀況下才使用Hashtable,那麼能夠考慮在Java中使用ConcurrentHashMap。

相關文章
相關標籤/搜索