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陣列,每乙...