首頁  >  文章  >  Java  >  淺析Java中Map與HashMap,Hashtable,HashSet的區別

淺析Java中Map與HashMap,Hashtable,HashSet的區別

高洛峰
高洛峰原創
2017-01-19 10:29:101648瀏覽

HashTable和HashMap區別

第一,繼承的父類別不同。
Hashtable繼承自Dictionary類,而HashMap繼承自AbstractMap類別。但二者都實作了Map介面。

public class Hashtable<K,V>
extends Dictionary<K,V>
implements Map<K,V>, Cloneable, Serializable
public class HashMap<K,V>
extends AbstractMap<K,V>
implements Map<K,V>, Cloneable, Serializable


第二,線程安全性不同。
Hashtable 中的方法是Synchronize的,而HashMap中的方法在缺省情況下是非Synchronize的。在多執行緒並發的環境下,可以直接使用Hashtable,不需要自己為它的方法實作同步,但使用HashMap時就必須自己增加同步處理。


第三,是否提供contains方法
HashMap把Hashtable的contains方法去掉了,改成containsValue和containsKey,因為contains方法容易讓人引起誤解。

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()方法來判斷。

第五,兩個遍歷方式的內部實作上不同。
Hashtable、HashMap都使用了 Iterator。而由於歷史原因,Hashtable也使用了Enumeration的方式 。

第六,hash值不同。
雜湊值的使用不同,HashTable直接使用物件的hashCode。而HashMap重新計算hash值。

第七,內部實作使用的陣列初始化和擴容方式不同。
Hashtable和HashMap它們兩個內部實作方式的陣列的初始大小和擴容的方式。 HashTable中hash數組預設大小是11,增加的方式是 old*2+1。

HashMap中hash陣列的預設大小是16,而且一定是2的指數。

更多淺析Java中Map與HashMap,Hashtable,HashSet的區別相關文章請關注PHP中文網!


陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn