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介面,它支...