成員變數
private
transient entry<?,?> table;//儲存鍊錶的陣列
private
transient
int count;
private
int threshold;
private
float loadfactor;
private
transient
int modcount = 0;
private
static
class
entry
implements
map.entry
}
構造方法初始化public
hashtable(int initialcapacity, float loadfactor)
public
hashtable(int initialcapacity)
//初始值table的大小為11,負載因子0.75
public
hashtable()
put方法/*
當乙個執行緒正在訪問乙個物件的 synchronized 例項方法,那麼其他執行緒不能訪問
該物件的其他synchronized方法,畢竟乙個物件只有一把鎖,當乙個執行緒獲取了該
物件的鎖之後,其他執行緒無法獲取該物件的鎖,所以無法訪問該物件的其他synchronized
例項方法,但是其他執行緒還是可以訪問該例項物件的其他非synchronized方法
*///採用synchronized修飾方法,可以保證多個執行緒中只能有乙個執行緒呼叫該方法
public
synchronized v put(k key, v value)
// makes sure the key is not already in the hashtable.
entry<?,?> tab = table;
int hash = key.hashcode();
int index = (hash & 0x7fffffff) % tab.length;//得到index的值
@suppresswarnings("unchecked")
entryentry = (entry)tab[index];//獲取該節點上的值
for(; entry != null ; entry = entry.next)
}//index處的值為空,新增節點
addentry(hash, key, value, index);
return
null;
}private
void
addentry(int hash, k key, v value, int index)
// creates the new entry.
@suppresswarnings("unchecked")
entrye = (entry) tab[index];
tab[index] = new entry<>(hash, key, value, e);
count++;
}protected
void
rehash()
//建立新的鍊錶陣列
entry<?,?> newmap = new entry<?,?>[newcapacity];
modcount++;
threshold = (int)math.min(newcapacity * loadfactor, max_array_size + 1);
table = newmap;
//將之前的值放在新的陣列中
for (int i = oldcapacity ; i-- > 0 ;)
}}
get方法//採用關鍵字synchronized修飾,呼叫該方法時是執行緒安全的
public
synchronized v get(object key)
}return
null;
}
remove方法public
synchronized v remove(object key) else
count--;
v oldvalue = e.value;
e.value = null;
return oldvalue;}}
//下標處的節點為空的話返回null
return
null;
}
原始碼剖析 Hashtable 原始碼剖析
hashtable同樣是基於雜湊表實現的,同樣每個元素都是key value對,其內部也是通過單鏈表解決衝突問題,容量不足 超過了閾值 時,同樣會自動增長。hashtable也是jdk1.0引入的類,是執行緒安全的,能用於多執行緒環境中。hashtable同樣實現了serializable介面,它支...
Hashtable 原始碼解析
hashtable 底層是以陣列加鍊表實現的,是執行緒安全。private transient entry table 全域性變數,存放hashtable的資料 private float loadfactor 全域性變數,負載因子 public hashtable 帶初始化數 public has...
HashTable原始碼分析
版本說明 jdk1.7.0 79 hashtable已經成為過時的集合,但是仍有必要研究一下其原始碼,而且面試中也經常被問到hashtable與hashmap的區別。hashtable是執行緒安全的,但是collections類中已經針對集合的執行緒安全有了新的實現,如果考慮到執行緒安全,請使用co...