HashMap和Hashtable的詳細區別

2021-09-11 18:18:34 字數 1500 閱讀 2612

兩者最主要的區別在於hashtable是執行緒安全,而hashmap則非執行緒安全。hashtable的實現方法裡面都新增了synchronized關鍵字來確保執行緒同步,因此相對而言hashmap效能會高一些,我們平時使用時若無特殊需求建議使用hashmap,在多執行緒環境下若使用hashmap需要使用collections.synchronizedmap()方法來獲取乙個執行緒安全的集合(collections.synchronizedmap()實現原理是collections定義了乙個synchronizedmap的內部類,這個類實現了map介面,在呼叫方法時使用synchronized來保證執行緒同步,當然了實際上操作的還是我們傳入的hashmap例項,簡單的說就是collections.synchronizedmap()方法幫我們在操作hashmap時自動新增了synchronized來實現執行緒同步,類似的其它collections.synchronizedxx方法也是類似原理。

hashmap可以使用null作為key,不過建議還是盡量避免這樣使用。hashmap以null作為key時,總是儲存在table陣列的第乙個節點上。而hashtable則不允許null作為key。

hashmap繼承了abstractmap,hashtable繼承dictionary抽象類,兩者均實現map介面。

hashmap的初始容量為16,hashtable初始容量為11,兩者的填充因子預設都是0.75。

hashmap擴容時是當前容量翻倍即:capacity2,hashtable擴容時是容量翻倍+1即:capacity2+1。

hashmap和hashtable的底層實現都是陣列+鍊錶結構實現。

兩者計算hash的方法不同:

hashtable計算hash是直接使用key的hashcode對table陣列的長度直接進行取模:

int hash = key.

hashcode()

;int index =

(hash &

0x7fffffff

)% tab.length;

hashmap計算hash對key的hashcode進行了二次hash,以獲得更好的雜湊值,然後對table陣列長度取摸:

static

inthash

(int h)

static

intindexfor

(int h,

int length)

判斷是否含有某個鍵

在hashmap 中,null 可以作為鍵,這樣的鍵只有乙個;可以有乙個或多個鍵所對

應的值為null。當get()方法返回null 值時,既可以表示hashmap 中沒有該鍵,也可

以表示該鍵所對應的值為null。因此,在hashmap 中不能用get()方法來判斷hashm

ap 中是否存在某個鍵,而應該用containskey()方法來判斷。hashtable 的鍵值都不能

為null,所以可以用get()方法來判斷是否含有某個鍵。

**:菜雞小王子

HashMap的工作原理和hashtable區別

1.hashmap的工作原理?hashmap底層是陣列 鍊錶 以陣列儲存元素,如有hash相同的元素,在陣列結構中,建立鍊錶結構,再把hash相同的元素放到鍊錶的下乙個節點 基於hashing 雜湊法 雜湊法 是一種將字元組成的字串轉換為固定長度的數值或索引值的方法 的原理。通過put get 方法...

HashMap和LinkedHashMap的區別

hashmap,linkedhashmap,treemap都屬於map map 主要用於儲存鍵 key 值 value 對,根據鍵得到值,因此鍵不允許鍵重複,但允許值重複。hashmap 是乙個最常用的map,它根據鍵的hashcode 值儲存資料,根據鍵可以直接獲取它的值,具有很快的訪問速度。ha...

HashMap和LinkedHashMap的區別

hashmap,linkedhashmap,treemap都屬於map map 主要用於儲存鍵 key 值 value 對,根據鍵得到值,因此鍵不允許鍵重複,但允許值重複。hashmap 是乙個最常用的map,它根據鍵的hashcode 值儲存資料,根據鍵可以直接獲取它的值,具有很快的訪問速度。ha...