HashTable原始碼簡析

2021-10-09 02:31:35 字數 1864 閱讀 6012

hashtable 資料結構是一種比較古老的 dictionary 實現 ,大家常用的hashmap 是實現的abstractmap。

hashtable 內部使用了table 陣列和entry鍊錶實現。

內部使用了synchronized 關鍵字保證執行緒安全,簡單粗暴,但是有效。

若擔心多執行緒環境下 hashtable 的阻塞 可以使用 concurrenthashmap

簡單分析一下hashtable的原始碼。

public

synchronized v put

(k key, v value)

// makes sure the key is not already in the hashtable.

// 確保 key 沒有儲存在 hashtable 中,確定陣列下標之後,遍歷鍊錶

//比對hash值

entry<?,

?> tab[

]= table;

int hash = key.

hashcode()

;int index =

(hash &

0x7fffffff

)% tab.length;

@suppresswarnings

("unchecked"

) entry

entry =

(entry

)tab[index]

;for

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

}//若key 不存在hashtable中 新增加乙個key

addentry

(hash, key, value, index)

;return null;

}

synchronized 修飾 put 方法,使用了泛型;

首先檢查value 如果為null 丟擲nullpointexception

hashtable key 也不能為空,native的key.hash() 會直接丟擲nullpointerexception()

接著檢查 key 是否已經存在於hashtable 中,通過確認table 資料下標之後,遍歷 鍊錶

鍊錶遍歷

for

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

}

如果存在則返回 舊值

如果不存在 則

新建乙個entry

private

void

addentry

(int hash, k key, v value,

int index)

// creates the new entry.

@suppresswarnings

("unchecked"

) entry

e =(entry

) tab[index]

; tab[index]

=new

entry

<

>

(hash, key, value, e)

;// 定位到陣列下標之後,在鍊錶頭部插入乙個entry

count++

; modcount++;}

//新建乙個entry

protected

entry

(int hash, k key, v value, entry

next)

hashtable 資料結構比較老舊,但從hashtable 的原始碼分析可以更好的掌握 hashmap concurrenthashmap

Sample BSP原始碼簡析

ifndef bsp h define bsp h include sdksample.h include filesystemlayer.h filesystemlayer.h 用來處理檔案系統的目錄 路徑等資訊 後面的mfslayer getconfigfilepath就是用了該檔案中定義的類。...

libc hashtable 原始碼簡析

本文分析的是 中截止至 2016 年 1 月 30 日最新的libc libc 中,hashtable的實現為鏈式結構。在教科書 introduction to algorithm 3rd edition 中,介紹的實現是由乙個陣列作為buckets,每個陣列中儲存乙個鍊錶。但是libc 中,使用乙...

HashMap原始碼簡析

hashmap 基於map介面實現的,允許使用null值和null鍵,但資料無序的.劃重點 執行緒不安全.若是想獲取乙個執行緒安全的hashmap,可用下面方法 map map collections.synchronizedmap new hashmap hashmap的主幹是entry陣列,每乙...