淺談C# 之 Hashtable 與 Dictionary的代碼執行個體

來源:互聯網
上載者:User
淺談C# 之 Hashtable 與 Dictionary的代碼執行個體:

Dictionary<TKey, TValue> () Hashtable()

  第一、儲存的資料類型

  Hashtable不是泛型的,不是型別安全的;Dictionary是泛型的,是型別安全的;

  Hashtable的索引值都是Object類型的,但是Dictionary的索引值的資料類型是可以指定的。

  也就是說如果往Hashtable裡面存入Object以外的資料類型,則在取出該資料時,需要對其進行顯示的類型轉換,才能夠正常使用。而Dictionary則沒有這個問題。

  從這方面講的話,Hashtable相當於Dictionary<Object,Object>

            Hashtable ht = new Hashtable();            Dictionary<string, int> dic = new Dictionary<string, int>();            ht.Add("A", 1);            dic.Add("A", 1);            //Console.WriteLine(ht["A"]+1);     //編譯錯誤!Object類型不能和int類型直接進行相加。              Console.WriteLine((int)ht["A"] + 1);//編譯通過,輸出結果為:2            Console.WriteLine(dic["A"] + 1);    //編譯通過,輸出結果為:2

  第二、讀取資料的順序與添加資料的順序的一致性

  Dictionary和Hashtable的讀取資料的順序和添加資料時的資料的順序的一致性均不能夠保證,或者可以說沒有一致性。

  Dictionary在只添加不刪除的時候能夠保持讀取資料的順序和添加時候的順序是一致的;

  但是經過刪除和添加操作之後,就不能夠保證讀取資料的順序和添加時候的順序一致了。

Dictionary<int, int> dic = new Dictionary<int, int>();            dic.Add(0, 0);            dic.Add(1, 1);            dic.Add(2, 2);            Console.WriteLine("僅僅經過添加元素處理之後:");            foreach (KeyValuePair<int, int> kvp in dic)            {                Console.WriteLine("Key:" + kvp.Key + " Value:" + kvp.Value);            }            dic.Remove(0);            dic.Add(3, 3);            Console.WriteLine("經過刪除和添加元素處理之後:");            foreach (KeyValuePair<int, int> kvp in dic)            {                Console.WriteLine("Key:" + kvp.Key + " Value:" + kvp.Value);            }            Console.ReadKey();

  對於Dicitionary而言,如果從中刪除一個元素,則之後新添加的元素會填補這個被刪除元素的位置,因而致使添加資料的順序與讀取資料的順序是不一致的。

  對於Hashtable而言,它的資料存放區順序是按一定的演算法算出來的,所以絕大多數情況下,它的資料讀取順序和資料添加順序是不一致的。

  所以如果你需要保持資料添加時的順序的時候,最好不要用Dictionary和Hashtable。

  第三、當用一個不存在的Key值到Hashtable或者Dictionary中取值時

  對於Hashtable而言,如果用一個不存在的Key值進行取值的話,會返回一個null;

            Hashtable ht = new Hashtable();            Console.WriteLine(ht["b"]==null);            Console.ReadKey();

  對於Dictionary而言,如果用一個不存在的Key值進行取值的話,會引發“System.Collections.Generic.KeyNotFoundException”類型的異常。

  所以在從Dictionary或者Hashtable取值時,可以先判斷Key值是否存在(用ContainsKey()方法進行判斷),以防止出現預期以外的值或者異常。

  第四、執行緒安全性

  Dictionary不是安全執行緒的,Hashtable是安全執行緒的。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.