在大多数编程语言中,字典比哈希表更受欢迎。这背后的原因是什么?
当前回答
另一个重要的区别是Hashtable是线程安全的。Hashtable具有内置的多读取器/单写入器(MR/SW)线程安全性,这意味着Hashtable允许一个写入器与多个读取器一起使用,而无需锁定。
在Dictionary的情况下,没有线程安全;如果需要线程安全,则必须实现自己的同步。
进一步阐述:
Hashtable通过Synchronized属性提供了一些线程安全性,该属性返回集合周围的线程安全包装。包装器通过在每次添加或删除操作时锁定整个集合来工作。因此,每个试图访问集合的线程都必须等待轮到它获取一个锁。这是不可扩展的,可能会导致大型集合的性能显著下降。此外,该设计没有完全保护免受比赛条件的影响。.NET Framework 2.0集合类(如List<T>、Dictionary<TKey、TValue>等)不提供任何线程同步;当在多个线程上同时添加或删除项时,用户代码必须提供所有同步
如果需要类型安全和线程安全,请在.NETFramework中使用并发集合类。在这里进一步阅读。
另外一个区别是,当我们在字典中添加多个条目时,条目的添加顺序保持不变。当我们从字典中检索条目时,我们将按照插入它们的相同顺序获取记录。而Hashtable不保留插入顺序。
其他回答
Dictionary<>是泛型类型,因此它是类型安全的。
您可以在HashTable中插入任何值类型,这有时可能会引发异常。但是Dictionary<int>只接受整数值,类似地Dictionary><string>只接受字符串。
因此,最好使用Dictionary<>而不是HashTable。
集合和泛型对于处理一组对象非常有用。在.NET中,所有集合对象都位于接口IEnumerable下,该接口又具有ArrayList(索引值)和HashTable(键值)。在.NET framework 2.0之后,ArrayList和HashTable被List和Dictionary取代。现在,Arraylist和HashTable在现在的项目中不再使用。
谈到HashTable和Dictionary之间的区别,Dictionary是泛型的,而Hastable不是泛型的。我们可以向HashTable中添加任何类型的对象,但在检索时需要将其转换为所需的类型。因此,它不是类型安全的。但对于字典,在声明自身时,我们可以指定键和值的类型,因此在检索时不需要强制转换。
我们来看一个示例:
散列表
class HashTableProgram
{
static void Main(string[] args)
{
Hashtable ht = new Hashtable();
ht.Add(1, "One");
ht.Add(2, "Two");
ht.Add(3, "Three");
foreach (DictionaryEntry de in ht)
{
int Key = (int)de.Key; //Casting
string value = de.Value.ToString(); //Casting
Console.WriteLine(Key + " " + value);
}
}
}
词典
class DictionaryProgram
{
static void Main(string[] args)
{
Dictionary<int, string> dt = new Dictionary<int, string>();
dt.Add(1, "One");
dt.Add(2, "Two");
dt.Add(3, "Three");
foreach (KeyValuePair<int, String> kv in dt)
{
Console.WriteLine(kv.Key + " " + kv.Value);
}
}
}
Hashtable对象由包含集合元素的桶组成。bucket是Hashtable中元素的虚拟子组,这使得搜索和检索比大多数集合更容易和更快。
Dictionary类具有与Hashtable类相同的功能。对于值类型,特定类型(而不是Object)的字典比Hashtable具有更好的性能,因为Hashtable的元素属于Object类型,因此,如果存储或检索值类型,通常会进行装箱和取消装箱。
进一步阅读:哈希表和字典集合类型
我能发现的另一个区别是:
我们不能在web服务中使用Dictionary<KT,VT>(泛型)。原因是没有web服务标准支持泛型标准。
从概念上讲,字典是一个哈希表。
如果你的意思是“为什么我们使用Dictionary<TKey,TValue>类而不是Hashtable类?”,那么答案很简单:Dictionary>TKey,TValue>是泛型类型,Hashtable不是。这意味着你可以通过Dictionary<TKey,TValue>获得类型安全性,因为你不能在其中插入任何随机对象,也不必强制转换你取出的值。
有趣的是,.NET Framework中的Dictionary<TKey,TValue>实现是基于Hashtable的,您可以从其源代码中的注释中看出:
通用字典已从Hashtable的源复制
来源
推荐文章
- PowerShell脚本在机器上返回。net框架的版本?
- 在哪些领域使用f#比c#更合适?
- 用c#创建一个空文件
- 如何改变列表<T>数据IQueryable<T>数据
- 数组与链表
- 您可以使用反射来查找当前正在执行的方法的名称吗?
- 流。Seek(0, SeekOrigin.Begin)或Position = 0
- 如果查询为空,则最大返回值
- "输出类型为类库的项目不能直接启动"
- 传递一个实例化的系统。类型作为泛型类的类型参数
- 从SqlCommand对象获取生成的SQL语句?
- 把内容放在HttpResponseMessage对象?
- 在c#中转换字符串为类型
- 如何比较单元测试中的列表
- 替换c#字符串中的多个字符