1.繼承的父類不一樣,HashMap繼承的是AbstractMap類,HashTable繼承的是Dictionary類,不過都實現了Map、Clone、Serializable三個接口。其中Dictionary類中註釋說是一個被廢棄的類,建議實現Map接口,以下圖:java
* NOTE: This class is obsolete. New implementations should * implement the Map interface, rather than extending this class.
2.HashTable key和value都不支持null,會拋出空指針異常;HashMap中key能夠爲null,這樣的鍵只有這一個。算法
3.線程安全不一樣,HashMap線程不安全,HashTable線程安全,可是性能低下不推薦。安全
4.遍歷方式有區別,HashMap用的是fail-fast迭代器。性能
5.初始容量大小和每次擴充容量大小的不一樣。Hashtable默認的初始大小爲11,以後每次擴充,容量變爲原來的2n+1。HashMap默認的初始化大小爲16。以後每次擴充,容量變爲原來的2倍。建立時,若是給定了容量初始值,那麼Hashtable會直接使用你給定的大小,而HashMap會將其擴充爲2的冪次方大小。也就是說Hashtable會盡可能使用素數、奇數。而HashMap則老是使用2的冪做爲哈希表的大小。this
之因此會有這樣的不一樣,是由於Hashtable和HashMap設計時的側重點不一樣。Hashtable的側重點是哈希的結果更加均勻,使得哈希衝突減小。當哈希表的大小爲素數時,簡單的取模哈希的結果會更加均勻。而HashMap則更加關注hash的計算效率問題。在取模計算時,若是模數是2的冪,那麼咱們能夠直接使用位運算來獲得結果,效率要大大高於作除法。HashMap爲了加快hash的速度,將哈希表的大小固定爲了2的冪。固然這引入了哈希分佈不均勻的問題,因此HashMap爲解決這問題,又對hash算法作了一些改動。這從而致使了Hashtable和HashMap的計算hash值的方法不一樣 。.net
6.計算hash值的方法不一樣線程
HashTable直接使用對象的HashCode,HashMap爲了解決衝突比較多,計算HashCode後又進行了一些運算數據設計
https://blog.csdn.net/wangxing233/article/details/79452946指針