Java基礎之HashTable與ConcurrentHashMap解析
HashTable和HashMap的區別
在面試的過程中,經常會被問到HashTable和HashMap的區別,下面就這些區別做一個簡單的總結。
1、繼承的父類不同
Hashtable繼承自Dictionary類,而HashMap繼承自AbstractMap類,但二者都實現了Map介面。
2、執行緒安全性不同
Hashtable 中的方法是Synchronized的,而HashMap中的方法在預設情況下是非Synchronized的。在多執行緒併發的環境下,可以直接使用Hashtable,不需要自己為它的方法實現同步,但使用HashMap時就必須要自己增加同步處理。
總結一句話:Hashtable(1.0版本)不建議在新程式碼中使用,不需要執行緒安全的場合可以用HashMap替換,需要執行緒安全的場合可以用ConcurrentHashMap替換。
3、是否提供contains方法
HashMap把Hashtable的contains方法去掉了,改成containsValue和containsKey,因為contains方法容易讓人引起誤解。 Hashtable則保留了contains,containsValue和containsKey三個方法,其中contains和containsValue功能相同。
4、key和value是否允許null值
Hashtable中,key和value都不允許出現null值。但是如果在Hashtable中有類似put(null,null)的操作,編譯同樣可以通過,因為key和value都是Object型別,但執行時會丟擲NullPointerException異常。
HashMap中,null可以作為鍵,這樣的鍵只有一個;可以有一個或多個鍵所對應的值為null。當get()方法返回null值時,可能是 HashMap中沒有該鍵,也可能使該鍵所對應的值為null。因此,在HashMap中不能由get()方法來判斷HashMap中是否存在某個鍵, 而應該用containsKey()方法來判斷。
5、遍歷的內部實現方式不同
Hashtable、HashMap都使用了 Iterator。但由於歷史原因,Hashtable還使用了Enumeration的方式 。
6,陣列初始化和擴容方式不同
HashTable在不指定容量的情況下的預設容量為11,而HashMap為16,Hashtable不要求底層陣列的容量一定要為2的整數次冪,而HashMap則要求一定為2的整數次冪。 具體擴容時,Hashtable將容量變為原來的2倍加1,而HashMap擴容時,將容量變為原來的2倍。