HashTable的原始碼分析

2021-08-13 19:39:34 字數 2450 閱讀 3187

看的是jdk1.8的原始碼

hashtable和hashmap類似:

1.threshold,loadfactor

2.都有擴容機制

3.內部都是單鏈表的陣列

不同:

1.hashtable繼承dictionary

2.hashtable裡的capacity不需要2的n次冪

3.hashtable裡好多方法是synchronized

4.hashtable不允許value有 null

5.尋找陣列下標的hash演算法不同,hashmap的演算法效率更好些

hashmap的key的hash,如果是null,則hash是0

static

final

int hash(object key)

hashmap: int index = (key.hashcode() ^ (key.hashcode() >>> 16))&(桶陣列長度-1)
hashtable沒有對key是否為null做處理,因此hashtable不允許key為null,傳null為key會報空指標

hashtable:int

index = (key.hashcode() & 0x7fffffff) % 桶陣列長度

hashtable的內部機構和hashmap是基本一樣的

最關鍵的還是容器,該容器是個hashtable.entry 類的陣列

private transient entry<?,?>

table;

entry

private

static

class

entry

implements

map.entry

......

}

hashmap最常用的是put方法,這裡也分析hashtable的put方法,比對hashmap,hashtable的原始碼要容易懂得多

public synchronized v put(k key, v value) 

entry<?,?> tab = table;

int hash = key.hashcode();

//對陣列容器長度取模得到下標

int index = (hash & 0x7fffffff) % tab.length;

@suppresswarnings("unchecked")

entryentry = (entry)tab[index];

//tab[index]如果找到不為空,則沿著當前儲存得單鏈表往下找

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

}//!!!如果tab[index]沒找到,或tab[index]裡的單鏈表有,單沒有該值,則加入

addentry(hash, key, value, index);

return

null;

}

private

void addentry(int hash, k key, v value, int

index)

//取得容器裡entry

entrye = (entry) tab[index];

//!!!新建立以entry,entry的next是傳入的e

tab[index] = new entry<>(hash, key, value, e);

count++;

}

rehash

protected

void rehash()

//新建立的2倍長度陣列

entry<?,?> newmap = new entry<?,?>[newcapacity];

modcount++;

threshold = (int)math.min(newcapacity * loadfactor, max_array_size + 1);

table = newmap;

//遍歷舊的陣列

for (int i = oldcapacity ; i-- > 0 ;)

}}

遍歷

public

synchronized enumerationkeys()

public

synchronized enumerationelements()

public set> entryset()
public setkeyset()

HashTable原始碼分析

版本說明 jdk1.7.0 79 hashtable已經成為過時的集合,但是仍有必要研究一下其原始碼,而且面試中也經常被問到hashtable與hashmap的區別。hashtable是執行緒安全的,但是collections類中已經針對集合的執行緒安全有了新的實現,如果考慮到執行緒安全,請使用co...

HashTable原理和原始碼分析

hashtable的特性 hashtable 跟hashmap 最大區別是hashmap具備執行緒安全性,所有的方法都是安全的 hashtable不支援null值和null鍵 hashtable結構同hashmap產不多 陣列 鍊錶,而且沒有紅黑樹,相比更簡單了 擴容 原始碼解析 引數 privat...

jdk原始碼分析之 HashTable

hashtable整體架構 hashtable實現雜湊表,該雜湊表將鍵對映到值。可以是任何不為空的key或者value。主要是因為hashtable的儲存或者檢索key必須實現hashcode 和equals方法,其類圖如下 類註解資訊 重要的成員變數 存放雜湊表的資料 private transi...