Hashtable原始碼詳解

2021-08-22 00:16:33 字數 2322 閱讀 7209

成員變數

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...