1. 程式人生 > 程式設計 >HashTable、HashSet和Dictionary的區別點總結

HashTable、HashSet和Dictionary的區別點總結

今天又去面試了,結果依然很悲催,平時太過於關注表面上的東西,有些實質卻不太清楚,遇到HashTable和Dictionary相關的知識,記錄下來,希望對後來人有所幫助,以及對自己以後複習可以參考。

1.HashTable

雜湊表(HashTable)表示鍵/值對的集合。在.NET Framework中,Hashtable是System.Collections名稱空間提供的一個容器,用於處理和表現類似key-value的鍵值對,其中key通常可用來快速查詢,同時key是區分大小寫;value用於儲存對應於key的值。Hashtable中key-value鍵值對均為object型別,所以Hashtable可以支援任何型別的keyvalue鍵值對,任何非 null 物件都可以用作鍵或值。

在雜湊表中新增一個key/鍵值對:HashtableObject.Add(key,); 

在雜湊表中去除某個key/鍵值對:HashtableObject.Remove(key);

從雜湊表中移除所有元素: HashtableObject.Clear();

判斷雜湊表是否包含特定鍵key: HashtableObject.Contains(key);

2.HashSet

HashSet<T>類主要是設計用來做高效能集運算的,例如對兩個集合求交集、並集、差集等。集合中包含一組不重複出現且無特性順序的元素,HashSet拒絕接受重複的物件。

HashSet<T>的一些特性如下:

a. HashSet<T>中的值不能重複且沒有順序。

b. HashSet<T>的容量會按需自動新增。

3.Dictionary

Dictionary表示鍵和值的集合。

Dictionary<string,string>是一個泛型

他本身有集合的功能有時候可以把它看成陣列

他的結構是這樣的:Dictionary<[key],[value]>

他的特點是存入物件是需要與[key]值一一對應的存入該泛型

通過某一個一定的[key]去找到對應的值

4.HashTable和Dictionary的區別:

(1).HashTable不支援泛型,而Dictionary支援泛型。

(2). Hashtable 的元素屬於 Object 型別,所以在儲存或檢索值型別時通常發生裝箱和拆箱的操作,所以你可能需要進行一些型別轉換的操作,而且對於int,float這些值型別還需要進行裝箱等操作,非常耗時。

(3).單執行緒程式中推薦使用 Dictionary,有泛型優勢,且讀取速度較快,容量利用更充分。多執行緒程式中推薦使用 Hashtable,預設的 Hashtable 允許單執行緒寫入,多執行緒讀取,對 Hashtable 進一步呼叫 Synchronized() 方法可以獲得完全執行緒安全的型別. 而 Dictionary 非執行緒安全,必須人為使用 lock 語句進行保護,效率大減。

(4)在通過程式碼測試的時候發現key是整數型Dictionary的效率比Hashtable快,如果key是字串型,Dictionary的效率沒有Hashtable快。

static void IntMethod()
    {
      int count = 1000000;
      Dictionary<int,int> dictionary = new Dictionary<int,int>();
      Hashtable hashtable = new Hashtable();
      for (int i = 0; i < count; i++)
      {
        dictionary.Add(i,i);
        hashtable.Add(i,i);
      }

      Stopwatch stopwatch = Stopwatch.StartNew();
      for (int i = 0; i < count; i++)
      {
        int value = dictionary[i];
      }
      stopwatch.Stop();
      Console.WriteLine(stopwatch.ElapsedMilliseconds);

      stopwatch = Stopwatch.StartNew();
      for (int i = 0; i < count; i++)
      {
        object value = hashtable[i];
      }
      stopwatch.Stop();

      Console.WriteLine(stopwatch.ElapsedMilliseconds);
 
    }

    static void MethodString()
    {
      int count = 1000000;
      Dictionary<string,string> dictionary = new Dictionary<string,string>();
      Hashtable hashtable=new Hashtable();
      for (int i = 0; i < count; i++)
      {
        dictionary.Add(i.ToString(),"aaa");
        hashtable.Add(i.ToString(),"aaa");
      }

      Stopwatch stopwatch = Stopwatch.StartNew();
      for (int i = 0; i < count; i++)
      {
        string value=dictionary[i.ToString()];
      }
      stopwatch.Stop();
      Console.WriteLine(stopwatch.ElapsedMilliseconds);

      stopwatch = Stopwatch.StartNew();
      for (int i = 0; i < count; i++)
      {
        object value = hashtable[i.ToString()];
      }
      stopwatch.Stop();

      Console.WriteLine(stopwatch.ElapsedMilliseconds);
    }

今天面試最大的收穫,不是總結以上的東西,而是讓我明白了許多東西不要追求表面的,不是為了完成什麼功能,而學習某種技術,更應該深入的去理解它的本質,基礎很重要。三位面試官,都非常出色,講了許多我平常很少用到的東西,和他們在一起交流,會學到不少的東西,真希望以後能進入像這樣的公司,讓自己快速的成長起來。

面試,不止是為了找一份滿意的工作,從中可以讓你學會如何溝通,如何去推銷自己,更重要的是讓自己瞭解自己的不足,自己在哪些方面還欠缺,還有待提高。

到此這篇關於HashTable、HashSet和Dictionary的區別點總結的文章就介紹到這了,更多相關HashTable、HashSet和Dictionary的區別內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!