首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> C# >> 關於C#

C# Hashtable 深度解析:雜湊表原理、操作與效能特性

     編輯:關於C#

Hashtable 核心特性

Hashtable (System.Collections) 為非泛型鍵值對集合,基於雜湊表演算法實現,提供近似 O(1) 的新增、刪除、查找效能。鍵值皆為 object 型別,需自行處理型別轉換與 Boxing/Unboxing 開銷。.NET 2.0+ 建議改用泛型 Dictionary<TKey, TValue> 獲得型別安全與效能提升。

內部運作原理

  • 雜湊碼計算:呼叫 Key 的 GetHashCode() 取得 32-bit 整數
  • 桶位索引:hashCode & (bucketCount - 1) (桶數為 2 的冪次)
  • 碰撞解決:鏈結串列法,同桶位鍵值對串成鏈表
  • 負載因子:預設 1.0,超過時自動擴容 (約 2 倍 + 資質數)
  • 鍵比較:Equals() 確認鍵相等

常用操作範例

var ht = new Hashtable();

// 新增/更新
ht["name"] = "Alice";
ht["age"] = 30;
ht.Add("city", "Taipei"); // 鍵重複拋例外

// 查找
if (ht.ContainsKey("name")) {
    string name = (string)ht["name"]; // 需轉型
}

// 刪除
ht.Remove("age");
ht.Clear();

// 列舉
foreach (DictionaryEntry entry in ht) {
    Console.WriteLine($"{entry.Key} = {entry.Value}");
}

// 同步包裝 (Thread-safe wrapper)
var syncHt = Hashtable.Synchronized(new Hashtable());

效能比較:Hashtable vs Dictionary

項目HashtableDictionary<TKey,TValue>
型別安全否 (object)是 (泛型)
Boxing 開銷有 (實值型別)無
序列化支援 ISerializable支援
多執行緒Synchronized() 包裝需自行鎖定或用 ConcurrentDictionary
效能 (實值型別)基準快 2-3 倍

最佳實務建議

  1. 新專案優先使用 Dictionary<TKey, TValue>,避免 Boxing 與型別轉換錯誤。
  2. 自訂類別作為 Key 時,必須同時覆寫 GetHashCode() 與 Equals(),確保雜湊碼一致性。
  3. 預估資料量大時,使用建構函式 new Dictionary(capacity) 減少擴容次數。
  4. 多執行緒讀寫場景改用 ConcurrentDictionary 或 ImmutableDictionary。
  5. 避免在迴圈中頻繁新增/刪除導致大量重新雜湊,考慮批次操作。

Hashtable結構圖1
Hashtable結構圖2
Hashtable結構圖3
操作範例1
操作範例2
操作範例3
效能測試1
效能測試2

本文對應《叩響 C# 之門》第 22.7 節 Hashtable 類教學內容

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved