1. 線程安全: HashMap 是非線程安全的,HashTable 是線程安全的;HashTable 內(nèi)部的方法基本都經(jīng)過 synchronized 修飾。(如果你要保證線程安全的話就使用 ConcurrentHashMap );
2. 效率: 因為線程安全的問題,HashMap 要比 HashTable 效率高一點。另外,HashTable 基本被淘汰,不要在代碼中使用它;(如果你要保證線程安全的話就使用 ConcurrentHashMap );
3. 對Null key 和Null value的支持: HashMap 中,null 可以作為鍵,這樣的鍵只有一個,可以有一個或多個鍵所對應(yīng)的值為 null。但是在 HashTable 中 put 進的鍵值只要有一個 null,直接拋NullPointerException。
4. 初始容量大小和每次擴充容量大小的不同 :(1)創(chuàng)建時如果不指定容量初始值,Hashtable 默認(rèn)的初始大小為11,之后每次擴充,容量變?yōu)樵瓉淼?n+1。HashMap 默認(rèn)的初始化大小為16。之后每次擴充,容量變?yōu)樵瓉淼?倍。(2)創(chuàng)建時如果給定了容量初始值,那么 Hashtable 會直接使用你給定的大小,而 HashMap 會將其擴充為2的冪次方大小。也就是說 HashMap 總是使用2的冪作為哈希表的大小,后面會介紹到為什么是2的冪次方。
5. 底層數(shù)據(jù)結(jié)構(gòu): JDK1.8 以后的 HashMap 在解決哈希沖突時有了較大的變化,當(dāng)鏈表長度大于閾值(默認(rèn)為8)時,將鏈表轉(zhuǎn)化為紅黑樹,以減少搜索時間。Hashtable 沒有這樣的機制。
6. 推薦使用:在 Hashtable 的類注釋可以看到,Hashtable 是保留類不建議使用,推薦在單線程環(huán)境下使用 HashMap 替代,如果需要多線程使用則用 ConcurrentHashMap 替代。