在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会自动将具有相同哈希值的键值对存储在同一个链表中。