dictionarydic = new dictionary();
dic.add(1, 5);
dic.add(10, 3);
dic.add(2, 5);
foreach (int key in dic.keys)
hashtable hashtable = new hashtable();
hashtable.add(1, 5);
hashtable.add(10, 3);
hashtable.add(2, 5);
foreach (object key in hashtable.keys)
dictionary
是根據插入的順序來遍歷,但是
hashtable
在插入時會打亂其位置。在反編譯這段原始碼時在
還提到hashtable
的執行緒是安全的,不過現在我還不理解這個就不寫啦。
dictionary
的儲存原理:
根據key
通過hash
計算來得到其應存放的虛擬記憶體位址,當按照
key進行查詢時,根據
key計算出其所存放的虛擬記憶體位址,去對應的記憶體位址找資料,得到其
value
。這一點
hashtable
與其相同
遍歷時
dictionary
和list
的效率:
dictionarydic = new dictionary();
random random = new random();
for (int i = 0; i < 100000; i++)
stringbuilder sb1 = new stringbuilder();
stopwatch sp1 = new stopwatch();
sp1.start();
foreach (string item in dic.keys)
sp1.stop();
listlist = new list();
for (int i = 0; i < 100000; i++)
sb1 = new stringbuilder(10000000);
sp1.reset();
sp1.start();
foreach (string s in list)
sp1.stop();
結果:
是對陣列做了一層包裝,在資料結構上稱之為線性表,而線性表的概念是,在記憶體中的連續區域,除了首節點和尾節點外,每個節點都有著其唯一的前驅結點和後續節點。
而hashtable
或者dictionary
,他是根據
key而根據
hash
演算法分析產生的記憶體位址,因此在巨集觀上是不連續的,雖然微軟對其演算法也進行了很大的優化。
由於這樣的不連續,在遍歷時,
dictionary
必然會產生大量的記憶體換頁操作,而
list
只需要進行最少的記憶體換頁即可
Hashtable和Dictionary效能比較
在.net1.1裡經常會使用到hashtable,到裡.net 2.0以後我發現有了乙個很好用的idictionary實現類dictionary。但還是會擔心dictionary的檢索效率是否跟hashtable相當,據我了解arraylist的檢索效率是非常差的,binarysearch也不如ha...
Hashtable和dictionary的區別
1 單執行緒程式中推薦使用 dictionary,有泛型優勢,且讀取速度較快,容量利用更充分.2 多執行緒程式中推薦使用 hashtable,預設的 hashtable 允許單執行緒寫入,多執行緒讀取,對 hashtable 進一步呼叫 synchronized 方法可以獲得完全執行緒安全的型別.而...
Hash表和Hash衝突
hash表中的元素儲存位址是通過hash函式計算出來的,當要取出指定元素的時候,直接通過hash函式計算出元素的儲存位址。有時候會出現key不同,但是通過hash函式計算出來的值相同,這個值相同意味著這兩個key要存在同一位置,這顯然不對,這就是hash衝突。hash函式有多種構造方法,常見的有直接...