Dictionary和Hashtable的異同

2021-07-05 11:47:40 字數 1727 閱讀 1808

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函式有多種構造方法,常見的有直接...