兩者都實現了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);