兩者最主要的區別在於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...