* hashtable比較早,是執行緒安全的雜湊對映表。內部採用entry陣列,每個entry均可作為鍊錶的頭,用來解決衝突(碰撞)。
* hashmap與hashtable基本原理一樣,只是hashmap允許null的key/value,且非執行緒安全。
* linkedhashmap從字面看有兩個意思,hash和linked,既通過hash雜湊儲存(與hashmap相同),又把每個entry(增加了before/after指標)通過雙向鍊錶進行連線,記錄元素插入的順序。根據key取資料,可按照hashmap的雜湊迅速定位value;迭代時,可按照雙向鍊錶,高效遍歷。
* 執行緒安全。
* key、value均不能為null。
* 包含了乙個entry陣列,而entry又是乙個鍊錶,用來處理衝突。
* 每個key對應了entry陣列中固定的位置(記為index),稱為槽位(slot)。槽位計算公式為: (key.hashcode() & 0x7fffffff) % entry.length() 。
* 當entry的實際元素數量(count)超過了分配容量(capacity)的75%時,新建乙個entry是原先的2倍,並重新hash(rehash)。
* rehash的核心思路是,將舊entry陣列的元素重新計算槽位,雜湊到新entry中。
entry類
12
3
4
5
6
7
8
9
10
class
entry
// entry是槽中的元素,可做鍊錶,解決雜湊衝突。
}
hashtable類
12
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
public
class
hashtable
// put(): 若key存在,返回舊value;若key不存在,返回null。
public
synchronized
v put(k key,v value)
}
// 是否需要rehash
if
(count >= threshold)
// 儲存到槽位,如果有衝突,新來的元素被放到了鍊錶前面。
entrye = tab[index];
// 舊有entry
tab[index] =
new
entry<>(hash,key,value,e
/* 舊有entry成為了新增entry的next */
);
count ++;
return
null
;
}
// rehash(): 再次hash。當entry的實際儲存數量佔分配容量的約75%時,擴容並且重新計算各個物件的槽位
static
final
int
max_array_size = integer.max_value -
8
;
protected
void
rehash()
}
}
}
JAVA hashtable常用方法和原始碼分析
public static void main string args public synchronized v put k key,v value entry tab table int hash key.hashcode 計算雜湊值,此處說明value值不能為null,否則會出現空指標異常 i...
AbstractCollection原始碼分析
abstractcollection抽象類提供了collection的骨架實現,collection分析請看 這裡直接看它的 是如何實現的.public abstract iterator iterator 該方法沒有實現.public abstract int size 該方法沒有實現.publi...
ThreadPoolExecutor原始碼閱讀
執行緒池解決兩個問題 一是復用執行緒,減少建立銷毀執行緒帶來系統開銷 二是限定系統資源使用邊界,避免大量執行緒消耗盡系統記憶體 適用於互不依賴,執行時間短,不需要對執行緒控制操作的執行緒 新增任務時,1.若執行緒數量小於corepoolsize,則新增執行緒執行任務 2.若執行緒數量大於等於core...