jdk原始碼分析之 HashTable

2021-10-09 21:39:56 字數 4438 閱讀 8369

hashtable整體架構

hashtable實現雜湊表,該雜湊表將鍵對映到值。可以是任何不為空的key或者value。主要是因為hashtable的儲存或者檢索key必須實現hashcode 和equals方法,其類圖如下:

類註解資訊

重要的成員變數

/**

* 存放雜湊表的資料

*/private

transient entry,

?>

table;

/** * hashtable中實際資料個數.

*/private

transient

int count;

/** *當表的大小超過此閾值時,表將被重新對映。 (

* 此字段的值為(int)(容量* loadfactor)

*/private

int threshold;

/** * hashtable承載因子.

*/private

float loadfactor;

/** * 記錄hashtable版本修改

*/private

transient

int modcount =

0;

初始化方式

public

hashtable()

public

hashtable

(int initialcapacity)

public

hashtable

(int initialcapacity,

float loadfactor)

public

hashtable

(map<

?extendsk,

?extends

v> t)

新增方法(put)hashtable新增資料的大致流程

對入參的key 和value做資料校驗,key和value都不能為空.

計算新的資料節點的key對應到陣列的響應的陣列索引。如果該索引的位置已經有值,則進行覆蓋,不存在則呼叫新增addentry()方法新增資料節點。

檢查陣列中的大小大於閾值的進行擴容,走4。否則直接建立新的 entrye並存入陣列table中,

計算出行的陣列容量,新的陣列容量為oldcapacity << 1 相當於 乘以2 在加1.

根據新計算的擴容大小進行擴容。

public

synchronized v put

(k key, v value)

// 確保key尚未在雜湊表中。

entry,

?> tab[

]= table;

// 計算key的雜湊值。如果為空則丟擲空指標

int hash = key.

hashcode()

;// 計算出新增資料節點落在table的索引位置。

//0x7fffffff為 最大的整型數 int就是除了首位是 0,其餘都是1

// & 運算如果相對應位都是1,則結果為1,否則為0

int index =

(hash &

0x7fffffff

)% tab.length;

@suppresswarnings

("unchecked"

) entry

entry =

(entry

)tab[index]

;// 遍歷hashtable,如果key已經在hashtable中,則將新新增的資料value覆蓋老的value值

// 並將老值返回

for(

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

}// 不存在則直接呼叫新增節點方法,並返回null

addentry

(hash, key, value, index)

;return null;

}

addentry新增節點

private

void

addentry

(int hash, k key, v value,

int index)

// 建立新的節點

@suppresswarnings

("unchecked"

) entry

e =(entry

) tab[index]

; tab[index]

=new

entry

<

>

(hash, key, value, e)

;// 桶中數量的修改

count++

;}

擴容rehash方法

/**

* hashtable擴容

*/@suppresswarnings

("unchecked"

)protected

void

rehash()

// 建立新的陣列。

entry,

?>

newmap =

newentry

,?>

[newcapacity]

;// 記錄版本修改

modcount++

;// 重新計算新的閾值,取出這兩者的最小值

threshold =

(int

)math.

min(newcapacity * loadfactor, max_array_size +1)

;// 將新建立出來的陣列覆蓋原先陣列

table = newmap;

// 將原先的資料重新計算落在新的陣列的位置

for(

int i = oldcapacity ; i--

>0;)}}

批量新增putall()

public

synchronized

void

putall

(map<

?extendsk,

?extends

v> t)

get方法

public

synchronized v get

(object key)

}// 找不到則返回null

return null;

}

remove方法

/**

* 從中刪除鍵(及其相應的值)雜湊表。如果鍵不在雜湊表中,則此方法不執行任何操作

* @param key 需要取下的鍵

*/public

synchronized v remove

(object key)

else

count--

; v oldvalue = e.value;

e.value = null;

return oldvalue;}}

return null;

}

clear方法

// 清除雜湊表中的值,

public

synchronized

void

clear()

contains方法

public

synchronized

boolean

contains

(object value)

entry,

?> tab[

]= table;

// 遍歷陣列中的entry的value相等則返回true,沒有則為false

for(

int i = tab.length ; i--

>0;

)}}return

false

;}

hashtable與hashmap區別

JDK原始碼分析 Vector

vector和arraylist有一定的不同 int newcapacity oldcapacity capacityincrement 0 capacityincrement oldcapacity 從這一句我們可以看出 增長容量 capacityincrement 0 增長倍數 陣列數量 舊容量...

JDK原始碼分析 Collections

1.集合框架圖 hashmap是通過 拉鍊法 實現的雜湊表。它包括幾個重要的成員變數 table,size,threshold,loadfactor,modcount。table是乙個entry陣列型別,而entry實際上就是乙個單向鍊錶。雜湊表的 key value鍵值對 都是儲存在entry陣列...

jdk1 8之ArrayList原始碼分析(二)

通過分析原始碼,你會發現,一些你在工作中無法體會到的一些現象,通過原始碼的了解,會擴散你的思維.這一次是講解下arraylist的刪除以及通過角標來新增元素。在檢視刪除方法的時候,remove方法存在兩個過載的方法,乙個是index乙個通過值的形式,進行刪除,public e remove int ...