HashMap 與 HashTable 的差異

兩者都實現了Map接口,但是它們有一些重大的區別,在決定使用HashMap還是HashTable的時候知道這些區別是非常重要的。區別包括:線程安全、同步、速度,以下是詳細敘述:

1. HashMap類大體上和HashTable相同,但是HashMap不是同步的,並且HashMap允許null值(HashMap允許key或者value的值爲null,但是HashTable中不可以)。


2. 兩者之間最重要的差異就是HashMap是非同步的,而HashTable是同步的,這就意味着HashTable是線程安全的,可以被多個線程共享;而HashMap在沒有被恰當的同步之前是不能夠被多個線程共享的。在Java5中引入了ConcurrentHashMap作爲一種可選擇的替代,並且比HashTable提供了更好的可擴展性。


3. HashMap vs HashTable的另外一個重要的區別是在HashMap中它的迭代器是快速失敗的(fail-fast),並且在發生結構性修改的時候會立即拋出ConcurrentModificationExeception異常。而在HashTable中這些是不會發生的。但是這並不是一個獲得保證的行爲,因爲這個行爲是JVM儘量去執行的。(注:通過閱讀HashMap的源碼可以發現,HashMap保存一個叫做modCount的值,每一次結構性修改的時候都會自增modCount的值,然後在迭代的時候,modCount會對迭代行爲產生影響)


4. 另一個需要留意的區別就是因爲保證線程安全和同步的實施,HashTable相比於HashMap是非常的慢的,假如在單線程的環境中或者不需要同步,應該考慮使用HashMap。


5. HashMap不保證元素在map中的映射順序隨着時間的改變是不變的。(因爲隨着容量的最大,會發生rehashing操作)


可以公共下面的方法使HashMap同步

Map m = Collections.synchronizeMap(hashMap);

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章