在C#中,Hashtable类使用链表来解决哈希冲突。当两个或多个键具有相同的哈希值时,它们将被添加到同一个链表中。为了处理这种冲突,Hashtable类提供了以下方法:
-
Add(object key, object value):向Hashtable中添加一个键值对。如果键已经存在,则更新其值。
-
Remove(object key):从Hashtable中删除一个键值对。如果键存在,则删除它并返回相应的值。
-
ContainsKey(object key):检查Hashtable中是否存在指定的键。如果存在,则返回true,否则返回false。
-
ContainsValue(object value):检查Hashtable中是否存在指定的值。如果存在,则返回true,否则返回false。
-
Get(object key):根据指定的键从Hashtable中获取相应的值。如果键不存在,则返回null。
在内部,Hashtable使用哈希函数将键转换为数组索引。如果两个键具有相同的哈希值,它们将被添加到同一个链表中。链表的每个节点都包含一个键值对,以及指向下一个节点的指针。当需要访问或修改链表中的元素时,Hashtable会遍历链表直到找到所需的元素。
以下是一个简单的C# Hashtable示例:
using System; using System.Collections; class Program { static void Main() { Hashtable hashtable = new Hashtable(); // 添加键值对 hashtable.Add("key1", "value1"); hashtable.Add("key2", "value2"); hashtable.Add("key3", "value3"); // 更新现有键的值 hashtable["key1"] = "newValue1"; // 删除键值对 hashtable.Remove("key2"); // 检查键是否存在 Console.WriteLine(hashtable.ContainsKey("key1")); // 输出: True Console.WriteLine(hashtable.ContainsKey("key2")); // 输出: False // 获取键对应的值 Console.WriteLine(hashtable["key1"]); // 输出: newValue1 // 遍历Hashtable foreach (DictionaryEntry entry in hashtable) { Console.WriteLine($"Key: {entry.Key}, Value: {entry.Value}"); } } }
这个示例展示了如何使用Hashtable类来添加、更新、删除和遍历键值对。当处理冲突时,Hashtable会自动将具有相同哈希值的键值对存储在同一个链表中。