Java Hashtable 原始碼簡要分析

2021-07-04 22:49:01 字數 3634 閱讀 9246

* 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

classentry// 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

publicclasshashtable

// put(): 若key存在,返回舊value;若key不存在,返回null。

publicsynchronizedv put(k key,v value)

}

// 是否需要rehash

if(count >= threshold)

// 儲存到槽位,如果有衝突,新來的元素被放到了鍊錶前面。

entrye = tab[index];// 舊有entry

tab[index] =newentry<>(hash,key,value,e/* 舊有entry成為了新增entry的next */);

count ++;

returnnull;

}

// rehash(): 再次hash。當entry的實際儲存數量佔分配容量的約75%時,擴容並且重新計算各個物件的槽位

staticfinalintmax_array_size = integer.max_value -8;

protectedvoidrehash()

}

}

}

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