摘自:地址
1.單線程程序推薦使用Dictionary:
- 泛型優(yōu)勢
- 讀取速度快
- 容量利用充分
2.多線程程序推薦使用Hastable:
- 默認(rèn)允許單線程寫入曲初,多線程讀取
- 可獲得安全線程,安全類型(調(diào)用Synchronized方法),Dictionary非線程安全,必須使用lock語句,效率大減
3.Dictionary具有按照 插入順序排序 的特性(調(diào)用Remove方法后順序被打亂)
使用哈希表保存集合元素時(鍵/值對),首先會根據(jù)鍵自動計算哈希代碼,以確定該元素的保存位置芋酌,再將元素的值放入到相應(yīng)位置所指向的桶中。
在查找時雁佳,再次通過鍵所對應(yīng)的哈希代碼指向的桶中進(jìn)行搜索隔嫡,減少查找元素進(jìn)行比較的次數(shù)。
Hastable中的Key/Value均為Object值甘穿,由包含鍵值對的桶組成腮恩。存儲桶比大多數(shù)集合中的搜索和檢索更為便捷。
Hastable的優(yōu)點(diǎn):
- 索引速度快(以任意類型鍵值訪問其中元素會快于其他集合温兼,特別是當(dāng)數(shù)據(jù)量大的情況下秸滴,效率差別尤其大)
遍歷Hastable的兩種方式:
因?yàn)镠astable元素都是鍵值對,所以元素類型既不是鍵的類型募判,也不是值的類型荡含,而是DictionaryEntry類型
方法一:
foreach(System.Collections.DictionaryEntry de in ht)
{
//因?yàn)镠astable內(nèi)存儲元素的默認(rèn)類型是Object,所以需要進(jìn)行類型轉(zhuǎn)換才可以輸出
Console.WriteLine(de.Key.ToString());
Console.WriteLine(de.Value.ToString());
}
方法二:
System.Collections.IDictionaryEnumerator enumerator = ht.GetEnumerator();
while(enumerator.MoveNext())
{
Console.WriteLine(enumerator.Key);
Console.WriteLine(enumerator.Value);
}
Dictionary
-
Dictionary<Key,Value>是Hastable的泛型實(shí)現(xiàn)
foreach(string key in myDictionary.Keys)
{
foreach(string val in myDictionary[key])
{
Console.WirteLine("Key : " + key + "/nValue : " + val);
}
}
因?yàn)镈ictionary是Key和Value的集合届垫,所以Dictionary中的元素類型并非是Key類型或Value類型释液。
相反,元素類型是鍵類型和值類型的鍵值對装处。