版本說明:jdk1.7.0_79
hashtable已經成為過時的集合,但是仍有必要研究一下其原始碼,而且面試中也經常被問到hashtable與hashmap的區別。hashtable是執行緒安全的,但是collections類中已經針對集合的執行緒安全有了新的實現,如果考慮到執行緒安全,請使用collections.synchronizedmap(map)來代替hashtable。
publicclass 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, floatloadfactor)
public hashtable(int
initialcapacity)
public
hashtable()
public hashtable(map<? extends k, ? extends v>t)
hashtable有4個構造方法。
若沒有指定初始容量和載入因子,則初始容量預設為11(hashmap為16),載入因子預設為0.75(同hashmap)
publicsynchronized
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已經存在,則覆蓋。
publicsynchronized
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...