当前位置: 代码网 > it编程>编程语言>C# > C#中Hashtable和Dictionary的区别

C#中Hashtable和Dictionary的区别

2024年05月28日 C# 我要评论
hashtable 和 dictionary 都是 c# 中用于存储键值对的数据结构哈希表 hashtable使用hashtable需要引入命名空间system.collections。hashtab

hashtable 和 dictionary 都是 c# 中用于存储键值对的数据结构

哈希表 hashtable

使用hashtable需要引入命名空间system.collections。hashtable中key/value的键值对均为object类型,所以hashtable可以支持任何类型的key/value键值对,hashtable中每个对象是一个存储在dictionaryentry对象中的键值对。

常用属性

属性描述
count获取hashtable中包含的键值对个数
keys获取hashtable中所有键的集合
values获取hashtable中所有值的集合

常用方法

方法描述
public virtual void add(object key, object value);向hashtable添加一个带有指定的键和值的元素
public virtual bool containskey(object key);判断hashtable是否包含指定的键
public virtual bool containsvalue(object value);判断hashtable是否包含指定的值
public virtual void remove(object key);从hashtable中移除指定的键的元素
public virtual void clear();从hashtable中移除所有的元素

注意:由于idictionary接口是键/值对的非泛型集合的基接口,而每个元素都是键/值对,并存储在dictionaryentry对象中,因此元素类型既不是键的类型,也不是值的类型,而是dictionaryentry类型。(留个坑,自己也没搞明白是啥)

hashtable ht = new hashtable();

ht.add(1, true);
ht.add(2, "false");

console.writeline("当前包含键值对个数:{0}", ht.count);//输出:2

console.writeline("---- 通过键求键值对 ----");
foreach (var key in ht.keys)
{
    console.writeline("{0} - {1}", key, ht[key]);//输出:2-"false" 1-true 
}

console.writeline("---- 添加后值的集合 ----");
foreach (var value in ht.values)
{
    console.writeline("{0}", value);//输出:false true
}

if (ht.containskey(1))
{
    console.writeline("hashtable中包含键 1 .");//输出
}

if(ht.containsvalue(true))
{
    console.writeline("hashtable中包含值 true .");//输出
}

ht.remove(1);
console.writeline("---- 移除键 1 之后 ----");
foreach(dictionaryentry de in ht)
{
    console.writeline("{0} - {1}", de.key, de.value);//输出:2 - false
}


ht.clear();
console.writeline("---- 移除全部之后 ----");
foreach (dictionaryentry de in ht)
{
    console.writeline("{0} ------- {1}", de.key, de.value);//无输出
}

console.readkey();

字典 dictionary

dictionary<tkey, tvalue>包含在system.collections.generic命名空间中。dictionary<tkey, tvalue>可以支持指定的任何类型的key/value键值对。所以dictionary<tkey, tvalue>对象只能添加指定类型的key/value键值对。dictionary<tkey, tvalue>中每个对象是一个存储在keyvaluepair<tkey, tvalue>对象中的键值对。

常用属性

属性描述
count获取dictionary<tkey, tvalue>中包含的键值对个数
item获取dictionary<tkey, tvalue>中的某个键值对
keys获取dictionary<tkey, tvalue>中所有键的集合
values获取dictionary<tkey, tvalue>中所有值的集合

常用方法

方法描述
public void add(tkey key, tvalue value);将指定的键和值添加到字典中
public bool containskey(tkey key);判断dictionary<tkey, tvalue>是否包含指定的键
public bool containsvalue(tvalue value);判断dictionary<tkey, tvalue>是否包含指定的值
public bool remove(tkey key);从dictionary<tkey, tvalue>中移除指定的键的元素
public void clear();从dictionary<tkey, tvalue>中移除所有的键值对
dictionary<int, string> dc = new dictionary<int, string>();

dc.add(21002121, "张三");
dc.add(21002122, "李四");

console.writeline("字典中的键值对个数:{0}", dc.count);//输出:2

console.writeline("---- 添加之后键值对 ----");
foreach (var item in dc)
{
    console.writeline("{0} - {1}", item.key, item.value);//输出:21002121 - 张三   21002122 - 李四
}

console.writeline("---- 通过键求键值对 ----");
foreach (var key in dc.keys)
{
    console.writeline("{0} - {1}", key, dc[key]);//输出:21002121 - 张三   21002122 - 李四
}

console.writeline("---- 添加后值的集合 ----");
foreach (var value in dc.values)
{
    console.writeline("{0}", value);//张三 李四
}

if(dc.containskey(21002121))
{
    console.writeline("dictionary中包含键 21002121 .");//输出
}

if(dc.containsvalue("李四"))
{
    console.writeline("dictionary中包含值 李四 .");//输出
}

dc.remove(21002121);

console.writeline("---- 移除键 21002121 之后 ----");
foreach (keyvaluepair<int, string> kp in dc)
{
    console.writeline("{0} - {1}", kp.key, kp.value);//输出:21002122 - 李四
}

dc.clear();
console.writeline("---- 移除全部之后 ----");
foreach (keyvaluepair<int, string> kp in dc)
{
    console.writeline("{0} ----- {1}", kp.key, kp.value);//无输出
}


console.readkey();

hashtable 与 dictionary 插入方法的时间比较

dictionary<int, int> dc = new dictionary<int, int>();
hashtable ht = new hashtable();

int count = 10000000;//插入的次数 1千万
stopwatch sw = new stopwatch();
sw.start();//计时
for(int i = 0; i < count; i++)
{
    dc.add(i, i);
}
sw.stop();
console.writeline("字典dictionary<tkey, tvalue>耗时(毫秒):" + sw.elapsedmilliseconds);//输出:388

sw.restart();
for (int i = 0; i < count; i++)
{
    ht.add(i, i);
}
sw.stop();
console.writeline("哈希表hashtable耗时(毫秒):" + sw.elapsedmilliseconds);//输出:2497
console.readline();

注意:所消耗的时间并不是唯一的,性能一般的电脑建议减低插入次数

区别

1. 实现方式:

hashtable 是基于哈希表实现的,而 dictionary 是基于泛型实现的。

2. 类型安全:

hashtable 是非泛型的,可以存储任意类型的键和值,而 dictionary 是泛型的,可以指定键和值的类型,并在编译时进行类型检查,提供更好的类型安全性。

3. 性能:

由于 hashtabl 是非泛型的,它在存储和检索数据时需要进行装箱和拆箱操作,这会带来一定的性能损耗。而 dictionary 是泛型的,不需要进行装箱和拆箱操作,因此在性能上通常比 hashtable 更好。

4. 可空键和值:

hashtable 允许存储 null 键和 null 值,而 dictionary 不允许存储 null 键和 null 值。

5. 迭代顺序:

hashtable 中的键值对是无序的,而 dictionary 中的键值对是按照插入顺序排序的。

总结:

  • 如果需要一个类型安全、性能较好且不需要存储 null 键和 null 值的键值对集合,推荐使用dictionary。
  • 如果需要一个可以存储任意类型的键和值,并且不关心性能和类型安全性的话,可以使用hashtable。

到此这篇关于c#中hashtable 和 dictionary的区别的文章就介绍到这了,更多相关c# hashtable dictionary内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网! 

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com