1. 哈希表(HashTable)簡述
在.NET Framework中,Hashtable是System.Collections命名空間提供的一個容器,用於處理和表現類似keyvalue的鍵值對,其中key通常可用來快速查找,同時key是區分大小寫;value用於存儲對應於key的值。Hashtable中keyvalue鍵值對均為object類型,所以Hashtable可以支持任何類型的keyvalue鍵值對.
2. 什么情況下使用哈希表
(1)某些數據會被高頻率查詢
(2)數據量大
(3)查詢字段包含字符串類型
(4)數據類型不唯一
3. 哈希表的使用方法
哈希表需要使用的namespace
using System.Collections; using System.Collections.Generic;
哈希表的基本操作:
//添加一個keyvalue鍵值對: HashtableObject.Add(key,value); //移除某個keyvalue鍵值對: HashtableObject.Remove(key); //移除所有元素: HashtableObject.Clear(); // 判斷是否包含特定鍵key: HashtableObject.Contains(key);
控制台程序例子:
using System;
using System.Collections; //file使用Hashtable時,必須引入這個命名空間
class Program
{
public static void Main()
{
Hashtable ht = new Hashtable(); //創建一個Hashtable實例
ht.Add("北京", "帝都"); //添加keyvalue鍵值對
ht.Add("上海", "魔都");
ht.Add("廣州", "省會");
ht.Add("深圳", "特區");
string capital = (string)ht["北京"];
Console.WriteLine(ht.Contains("上海")); //判斷哈希表是否包含特定鍵,其返回值為true或false
ht.Remove("深圳"); //移除一個keyvalue鍵值對
ht.Clear(); //移除所有元素
}
}
哈希表中使用多種數據類型的例子:
using System;
using System.Collections;
class Program
{
static Hashtable GetHashtable()
{
Hashtable hashtable = new Hashtable();
hashtable.Add("名字", "小麗");
hashtable.Add("年齡", 22);
return hashtable;
}
static void Main()
{
Hashtable hashtable = GetHashtable();
string name = (string)hashtable["名字"];
Console.WriteLine(name);
int age = (int)hashtable["年齡"];
Console.WriteLine(age);
}
}
當獲取哈希表中數據時,如果類型聲明的不對,會出現InvalidCastException錯誤。使用as-statements可以避免該錯誤。
using System;
using System.Collections;
using System.IO;
class Program
{
static void Main()
{
Hashtable hashtable = new Hashtable();
hashtable.Add(100, "西安");
// 能轉換成功
string value = hashtable[100] as string;
if (value != null)
{
Console.WriteLine(value);
}
// 轉換失敗,獲取的值為null,但不會拋出錯誤。
StreamReader reader = hashtable[100] as StreamReader;
if (reader == null)
{
Console.WriteLine("西安不是StreamReader型");
}
// 也可以直接獲取object值,再做判斷
object value2 = hashtable[100];
if (value2 is string)
{
Console.Write("這個是字符串型: ");
Console.WriteLine(value2);
}
}
}
4. 遍歷哈希表
遍歷哈希表需要用到DictionaryEntry Object,代碼如下:
for(DictionaryEntry de in ht) //ht為一個Hashtable實例
{
Console.WriteLine(de.Key); //de.Key對應於keyvalue鍵值對key
Console.WriteLine(de.Value); //de.Key對應於keyvalue鍵值對value
}
遍歷鍵
foreach (int key in hashtable.Keys)
{
Console.WriteLine(key);
}
遍歷值
foreach (string value in hashtable.Values)
{
Console.WriteLine(value);
}
5. 對哈希表進行排序
對哈希表按key值重新排列的做法:
ArrayList akeys=new ArrayList(ht.Keys);
akeys.Sort(); //按字母順序進行排序
foreach(string key in akeys)
{
Console.WriteLine(key + ": " + ht[key]); //排序后輸出
}
6. 哈希表的效率
System.Collections下的哈希表(Hashtable)和System.Collections.Generic下的字典(Dictionary)都可用作lookup table,下面比較一下二者的執行效率。
Stopwatch sw = new Stopwatch();
Hashtable hashtable = new Hashtable();
Dictionary<string, int> dictionary = new Dictionary<string, int>();
int countNum = 1000000;
sw.Start();
for (int i = 0; i < countNum; i++)
{
hashtable.Add(i.ToString(), i);
}
sw.Stop();
Console.WriteLine(sw.ElapsedMilliseconds); //輸出: 744
sw.Restart();
for (int i = 0; i < countNum; i++)
{
dictionary.Add(i.ToString(), i);
}
sw.Stop();
Console.WriteLine(sw.ElapsedMilliseconds); //輸出: 489
sw.Restart();
for (int i = 0; i < countNum; i++)
{
hashtable.ContainsKey(i.ToString());
}
sw.Stop();
Console.WriteLine(sw.ElapsedMilliseconds); //輸出: 245
sw.Restart();
for (int i = 0; i < countNum; i++)
{
dictionary.ContainsKey(i.ToString());
}
sw.Stop();
Console.WriteLine(sw.ElapsedMilliseconds); //輸出: 192
由此可見,添加數據時Hashtable快。頻繁調用數據時Dictionary快。
結論:Dictionary<K,V>是泛型的,當K或V是值類型時,其速度遠遠超過Hashtable。
