HashTable原理和原始碼分析

2021-09-02 11:45:45 字數 2999 閱讀 7528

hashtable的特性

hashtable 跟hashmap 最大區別是hashmap具備執行緒安全性,所有的方法都是安全的;

hashtable不支援null值和null鍵;

hashtable結構同hashmap產不多:陣列 + 鍊錶,而且沒有紅黑樹,相比更簡單了:

擴容:

原始碼解析

引數:

private

transient hashtableentry,

?>

table;

// 陣列儲存

private

transient

int count;

// 結點的總數

private

int threshold;

// 擴容的臨界值

private

float loadfactor;

// 預設是0.75,到達需要擴容的比例

private

transient

int modcount =0;

// 修改的次數,例如put、remove、clear等

從引數就可以看出跟hashmap大同小異,而且簡潔了許多。

建構函式

public

hashtable()

public

hashtable

(int initialcapacity,

float loadfactor)

從上面建構函式可以看到,預設初始容量 = threshold = 11; 載入因子 = 0.75

put

增加或者修改乙個節點

public

synchronized v put

(k key, v value)

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

hashtableentry,

?> tab[

]= table;

int hash = key.

hashcode()

;// 直接hash求餘 得到hash桶位置

int index =

(hash &

0x7fffffff

)% tab.length;

@suppresswarnings

("unchecked"

) hashtableentry

entry =

(hashtableentry

)tab[index]

;// 遍歷hash桶

for(

; entry != null ; entry = entry.next)

}// 沒有存在key,增加節點到乙個新的hash桶

addentry

(hash, key, value, index)

;return null;

}// 沒有存在key,增加節點到乙個新的hash桶

private

void

addentry

(int hash, k key, v value,

int index)

// creates the new entry.

@suppresswarnings

("unchecked"

) hashtableentry

e =(hashtableentry

) tab[index]

;// 新增節點到乙個新的桶中

tab[index]

=new

hashtableentry

<

>

(hash, key, value, e)

; count++

;}

remove移除節點

public

synchronized v remove

(object key)

else

count--

; v oldvalue = e.value;

e.value = null;

return oldvalue;}}

return null;

}

擴容

hashtable的擴容

protected

void

rehash()

hashtableentry,

?>

newmap =

newhashtableentry

,?>

[newcapacity]

; modcount++

;// 運算元 +1

// 這裡是符合預期的,threhold = initialcapacity * loadfactor

threshold =

(int

)math.

min(newcapacity * loadfactor, max_array_size +1)

; table = newmap;

// 遷移所有舊的節點到新的hash桶中

for(

int i = oldcapacity ; i--

>0;)}}

擴容:

容量增加為原來2倍+1; 將每個結點重新hash遷移到對應的新的hash桶中

這裡的增加節點跟hashmap的鍊錶有點不一樣,hashtable是直接插入到鍊錶的頭部,hashmap是在尾部。

HashTable原理與原始碼分析

hashtable內部儲存結構為陣列 單向鍊錶的形式儲存資料,即定義的entry,table 變數 使用entry陣列儲存資料 entry 單向鍊錶 private transient entry,table 已經儲存在table 的 entry 個數 private transient intco...

Vector和Hashtable原始碼閱讀與理解

vector是執行緒安全的arraylist public synchronized void insertelementat e obj,int index ensurecapacityhelper elementcount 1 system.arraycopy elementdata,index...

原始碼剖析 Hashtable 原始碼剖析

hashtable同樣是基於雜湊表實現的,同樣每個元素都是key value對,其內部也是通過單鏈表解決衝突問題,容量不足 超過了閾值 時,同樣會自動增長。hashtable也是jdk1.0引入的類,是執行緒安全的,能用於多執行緒環境中。hashtable同樣實現了serializable介面,它支...