1. 程式人生 > >淺析HashMap和Hashtable的區別

淺析HashMap和Hashtable的區別

兩個 ble dem pub 實現 value key-value span div

HashMap和Hashtable兩個類都實現了Map接口,二者保存鍵值對(key-value對);

HashMapHashTable區別

第一,繼承的父類不同。
HashMap繼承自AbstractMap類,而Hashtable繼承自Dictionary類,HashMap是Hashtable的輕量級實現(非線程安全的實現),二者都實現了Map接口。

public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable{}

public class Hashtable<K,V> extends Dictionary<K,V> implements Map<K,V>, Cloneable, java.io.Serializable {}

第二,線程安全性不同。
HashMap中的方法是非同步的,而Hashtable 中的方法是同步的。在多線程並發的環境下,可以直接使用Hashtable,不需要自己為它的方法實現同步,為了使線程安全我們使用HashMap時就必須要自己增加同步處理。HashMap的同步問題可通過Collections的一個靜態方法得到解決:
Map Collections.synchronizedMap(Map m)
這個方法返回一個同步的Map,這個Map封裝了底層的HashMap的所有方法,使得底層的HashMap即使是在多線程的環境中也是安全的。  由於HashMap是線程不同步(線程不安全)的,所以效率要高於HashTable. 

第三,是否提供contains方法

HashMap把Hashtable的contains方法去掉了,改成containsValue和containsKey。

技術分享

Hashtable則保留了contains,containsValue和containsKey三個方法,其中contains和containsValue功能相同。

技術分享

第四,key和value是否允許null值。
其中key和value都是對象,並且不能包含重復key,但可以包含重復的value。
Hashtable中,key和value都不允許出現null值。
HashMap中,null可以作為鍵,這樣的鍵只有一個;可以有一個或多個鍵所對應的值為null。當get()方法返回null值時,可能是 HashMap中沒有該鍵,也可能使該鍵所對應的值為null。因此,在HashMap中不能由get()方法來判斷HashMap中是否存在某個鍵, 而應該用containsKey()方法來判斷。

淺析HashMap和Hashtable的區別