hashmap和hashtable的區別
1、繼承的父類不同
Hashtable繼承自Dictionary類,而HashMap繼承自AbstractMap類。但二者都實現了Map介面。
2、執行緒安全性不同
javadoc中關於hashmap的一段描述如下:此實現不是同步的。如果多個執行緒同時訪問一個雜湊對映,而其中至少一個執行緒從結構上修改了該對映,則它必須保持外部同步。
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異常,這是JDK的規範規定的。
HashMap中,null可以作為鍵,這樣的鍵只有一個;可以有一個或多個鍵所對應的值為null。當get()方法返回null值時,可能是 HashMap中沒有該鍵,也可能使該鍵所對應的值為null。因此,在HashMap中不能由get()方法來判斷HashMap中是否存在某個鍵, 而應該用containsKey()方法來判斷。
5、兩個遍歷方式的內部實現上不同
Hashtable、HashMap都使用了 Iterator。而由於歷史原因,Hashtable還使用了Enumeration的方式 。
6、hash值不同
雜湊值的使用不同,HashTable直接使用物件的hashCode。而HashMap重新計算hash值。hashCode是jdk根據物件的地址或者字串或者數字算出來的int型別的數值。
7、內部實現使用的陣列初始化和擴容方式不同
HashTable在不指定容量的情況下的預設容量為11,而HashMap為16,Hashtable不要求底層陣列的容量一定要為2的整數次冪,而HashMap則要求一定為2的整數次冪。Hashtable擴容時,將容量變為原來的2倍加1,而HashMap擴容時,將容量變為原來的2倍。
HashMap是在JDK1.2中引入的Map的實現類。HashMap是基於雜湊表實現的,每一個元素是一個key-value對,其內部透過單鏈表解決衝突問題,容量不足(超過了閥值)時,同樣會自動增長。
Hashtable同樣是基於雜湊表實現的,同樣每個元素是一個key-value對,其內部也是透過單鏈表解決衝突問題,容量不足(超過了閥值)時,同樣會自動增長。
Hashtable也是JDK1.0引入的類,是執行緒安全的,能用於多執行緒環境中。
Hashtable同樣實現了Serializable介面,它支援序列化,實現了Cloneable介面,能被克隆。
hashmap和hashtable的區別
1、繼承的父類不同
Hashtable繼承自Dictionary類,而HashMap繼承自AbstractMap類。但二者都實現了Map介面。
2、執行緒安全性不同
javadoc中關於hashmap的一段描述如下:此實現不是同步的。如果多個執行緒同時訪問一個雜湊對映,而其中至少一個執行緒從結構上修改了該對映,則它必須保持外部同步。
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異常,這是JDK的規範規定的。
HashMap中,null可以作為鍵,這樣的鍵只有一個;可以有一個或多個鍵所對應的值為null。當get()方法返回null值時,可能是 HashMap中沒有該鍵,也可能使該鍵所對應的值為null。因此,在HashMap中不能由get()方法來判斷HashMap中是否存在某個鍵, 而應該用containsKey()方法來判斷。
5、兩個遍歷方式的內部實現上不同
Hashtable、HashMap都使用了 Iterator。而由於歷史原因,Hashtable還使用了Enumeration的方式 。
6、hash值不同
雜湊值的使用不同,HashTable直接使用物件的hashCode。而HashMap重新計算hash值。hashCode是jdk根據物件的地址或者字串或者數字算出來的int型別的數值。
7、內部實現使用的陣列初始化和擴容方式不同
HashTable在不指定容量的情況下的預設容量為11,而HashMap為16,Hashtable不要求底層陣列的容量一定要為2的整數次冪,而HashMap則要求一定為2的整數次冪。Hashtable擴容時,將容量變為原來的2倍加1,而HashMap擴容時,將容量變為原來的2倍。
HashMap簡介HashMap是在JDK1.2中引入的Map的實現類。HashMap是基於雜湊表實現的,每一個元素是一個key-value對,其內部透過單鏈表解決衝突問題,容量不足(超過了閥值)時,同樣會自動增長。
Hashtable簡介Hashtable同樣是基於雜湊表實現的,同樣每個元素是一個key-value對,其內部也是透過單鏈表解決衝突問題,容量不足(超過了閥值)時,同樣會自動增長。
Hashtable也是JDK1.0引入的類,是執行緒安全的,能用於多執行緒環境中。
Hashtable同樣實現了Serializable介面,它支援序列化,實現了Cloneable介面,能被克隆。