[C#] Hashtable 和 Dictionary 集合型別的差別

Hashtable 類別和 Dictionary 泛型類別會實作 IDictionary 介面。
此外,Dictionary 泛型類別還會實作 IDictionary 泛型介面。
因此,這些集合中的每個元素都是一組索引鍵/值組。
Hashtable 物件是由包含集合中元素的 Bucket 所組成。
Bucket 是 Hashtable 內元素的虛擬子群組,可以讓大部分集合中的搜尋和擷取工作更容易、更快速。
各個雜湊桶都與雜湊程式碼 (使用雜湊函式並根據元素的索引鍵來產生) 相關聯。
雜湊函式為根據索引鍵來傳回數值雜湊程式碼的演算法。索引鍵是被儲存物件的某些屬性值。
雜湊函式必須永遠替相同索引鍵傳回相同雜湊程式碼。雜湊函式有可能為兩個不同索引鍵產生相同雜湊程式碼,
但替每一個唯一索引鍵產生唯一雜湊程式碼的雜湊函式在從雜湊表擷取元素時會產生較佳效能。
在 Hashtable 中做為元素使用的每個物件,都必須能使用 GetHashCode 方法的實作來產生本身的雜湊程式碼。
然而,您也可以使用接受 IHashCodeProvider 實作做為其中一個參數的 Hashtable 建構函式 (Constructor),
將雜湊函式指定給 Hashtable 中的所有元素。
當物件加入至 Hashtable 時,它是儲存在與物件雜湊程式碼相符之雜湊程式碼相關的 Bucket 中。
在 Hashtable 內搜尋值時,雜湊程式碼會為該值產生,並且會搜尋與該雜湊程式碼相關的 Bucket。
例如,字串的雜湊函式可能接受字串中各個字元的 ASCII 碼,並將它們加起來以產生雜湊程式碼。
字串 "picnic" 將會有不同於字串 "basket" 之雜湊程式碼的雜湊程式碼;
因此,字串 "picnic" 和 "basket" 將會放在不同雜湊桶。
對照之下,"stressed" 和 "desserts" 則會具有相同雜湊程式碼,並且會放在相同雜湊桶中。
Dictionary 類別與 Hashtable 類別具有相同的功能。
特定型別 (Object 以外) 的 Dictionary 比實值型別 (Value Type) 的 Hashtable 具有更好的效能,
因為 Hashtable 的元素型別為 Object,而且如果儲存或擷取實值型別,
通常會產生 Boxing 和 Unboxing 的狀況。
reference:

留言