HashTable原始碼分析

2022-03-23 09:22:52 字數 2507 閱讀 3131

版本說明:jdk1.7.0_79

hashtable已經成為過時的集合,但是仍有必要研究一下其原始碼,而且面試中也經常被問到hashtable與hashmap的區別。hashtable是執行緒安全的,但是collections類中已經針對集合的執行緒安全有了新的實現,如果考慮到執行緒安全,請使用collections.synchronizedmap(map)來代替hashtable。

public

class hashtableextends dictionaryimplements map,cloneable,serializable

public

class hashmapextends abstractmapimplements map, cloneable, serializable

通過比較可知,hashmap和hashtable都實現了map介面,cloneable介面,serializable介面。但hashmap繼承於abstractmap類,而hashtable繼承於dictionary類。

//

用來儲存元素

private

transient entry table;

//元素總個數

private

transient

intcount;

//閾值

private

intthreshold;

//載入因子

private

float

loadfactor;

private

transient

int modcount = 0;

static

final

int alternative_hashing_threshold_default =integer.max_value;

transient

int hashseed;

public hashtable(int initialcapacity, float

loadfactor)

public hashtable(int

initialcapacity)

public

hashtable()

public hashtable(map<? extends k, ? extends v>t)

hashtable有4個構造方法。 

若沒有指定初始容量和載入因子,則初始容量預設為11(hashmap為16),載入因子預設為0.75(同hashmap)

public

synchronized

v put(k key, v value)

//makes sure the key is not already in the hashtable.

entry tab =table;

//計算key的hash碼

int hash =hash(key);

//通過hash定位key在陣列中的索引

int index = (hash & 0x7fffffff) %tab.length;

//遍歷鍊錶,查詢key是否存在

for (entrye = tab[index] ; e != null ; e =e.next)

}modcount++;

//判斷元素總個數是否達到閾值,是則進行再雜湊(以保持元素均勻分布)

if (count >=threshold)

//creates the new entry.

entrye =tab[index];

tab[index] = new entry<>(hash, key, value, e);

count++;

return

null

; }

hashtable存放的鍵值對中的值不能為null。

判斷key是否存在,通過(e.hash == hash) && e.key.equals(key)。如果該key已經存在,則覆蓋。

public

synchronized

v get(object key)

}//key不存在,返回null

return

null

; }

1.hashtable和hashmap都實現了map介面,但hashtable繼承於dictionary類,而hashmap繼承於abstractmap類。

2.hashtable是執行緒安全的,而hashmap是非執行緒安全的。因此,hashtable比hashmap的效率要低。

3.hashtable的key和value都不能為null。而hashmap的key和value都可以為null。hashtable/hashmap與key/value為null的關係

4.hashtable使用enumeration,hashmap使用iterator。

5.hashtable的初始容量預設為11,hashmap的初始容量為16。

HashTable的原始碼分析

看的是jdk1.8的原始碼 hashtable和hashmap類似 1.threshold,loadfactor 2.都有擴容機制 3.內部都是單鏈表的陣列 不同 1.hashtable繼承dictionary 2.hashtable裡的capacity不需要2的n次冪 3.hashtable裡好多...

HashTable原理和原始碼分析

hashtable的特性 hashtable 跟hashmap 最大區別是hashmap具備執行緒安全性,所有的方法都是安全的 hashtable不支援null值和null鍵 hashtable結構同hashmap產不多 陣列 鍊錶,而且沒有紅黑樹,相比更簡單了 擴容 原始碼解析 引數 privat...

jdk原始碼分析之 HashTable

hashtable整體架構 hashtable實現雜湊表,該雜湊表將鍵對映到值。可以是任何不為空的key或者value。主要是因為hashtable的儲存或者檢索key必須實現hashcode 和equals方法,其類圖如下 類註解資訊 重要的成員變數 存放雜湊表的資料 private transi...