看的是jdk1.8的原始碼
hashtable和hashmap類似:
1.threshold,loadfactor不同:2.都有擴容機制
3.內部都是單鏈表的陣列
1.hashtable繼承dictionary2.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...