HashTable
HashTable 表示根据键的哈希代码进行组织的键/值对的集合
- HashTable添加数据,都是“键值对”的形式
- 键值对均是object类型,键值对中的键就是为了找数据用的,必须提供,不允许重复
- HashTable使用键作为寻找的方式,是一种无序的结构,使用hashTable[键],将返回键所对应的值
- HashTable的键可以是任意对象,而值可以是任意类型的对象。
使用实例:
定义Hashtable:
Hashtable ht = new Hashtable();
添加元素:
ht.Add("name", "John");
ht.Add(1, "value");
获取值:
string name = (string)ht["name"];
//在键值对集合中 是根据键去找值的
Console.WriteLine(ht[1]);
Console.WriteLine(ht[2]);
Console.WriteLine(ht[3]);
Console.WriteLine(ht[false]);
Console.WriteLine("==================================");
修改值:
ht["name"] = "Mike";
删除元素:
//ht.Clear(); //移除集合中所有的元素
ht.Remove("name");
查看元素个数:
int count = ht.Count;
遍历输出:
foreach(DictionaryEntry de in ht)
Console.WriteLine(de.Key + " - " + de.Value);
通过这些示例可以看到,HashTable提供了常用的操作键值对元素的基本方法,比如添加、获取、修改、删除等。它支持对象作为键值,并且是线程安全的。
Dictionary
Dictionary 和 HashTable 类似,可以用于存储和检索键值对数据的数据结构。
Dictionary<TKey,TValue>在尖括号中填入键的类型与值的类型,那么这个集合就变成了一个指定的键值对模型
特点:
使用泛型,键和值的类型可以指定。
键值必须唯一,但值可以重复。
支持快速添加、获取、修改和删除操作。
底层使用哈希表实现,提供快速查找。
定义Dictionary:
Dictionary<int, string> dict = new Dictionary<int, string>();
添加元素:
dict.Add(1, "one");
dict.Add(2, "two");
获取值:
string value = dict[1];
修改值:
dict[1] = "uno";
删除元素:
dict.Remove(2);
检查包含键:
bool contains = dict.ContainsKey(1);
清空字典:
dict.Clear();
迭代输出:
foreach(var kvp in dict)
Console.WriteLine(kvp.Key + ":" + kvp.Value);
Dictionary提供了类型安全的键值对存储,支持常见操作,性能高效。广泛使用在数据映射场景。
Dictionary和HashTable差异
-
泛型与非泛型
Dictionary是泛型集合,可以指定键值类型。HashTable是非泛型,键值类型是Object。 -
键值重复
Dictionary键值必须唯一,不允许重复。HashTable键允许重复,但最后一个值会覆盖前面。 -
线程安全
HashTable是线程安全的,内部操作同步处理,性能较差。Dictionary不是线程安全的。 -
性能
Dictionary通过泛型化可以避免 boxing/unboxing,性能比HashTable高。 -
键值类型
Dictionary键值允许null,HashTable键不允许null,值可以null。 -
语法
Dictionary使用键值对<>表示类型,访问使用[key]。HashTable是传统语法。 -
新增方法
Dictionary新增了ContainsKey等便利方法。
总之:
Dictionary适用于需要类型安全且线程不安全(性能优先)的场景。HashTable适用于需要线程安全但类型不限的场景。现在更推荐使用Dictionary,除非明确需要线程安全特性。所以在选择时需要权衡所需功能和性能要求选择合适的集合类。