在大多数编程语言中,字典比哈希表更受欢迎。这背后的原因是什么?
当前回答
我能发现的另一个区别是:
我们不能在web服务中使用Dictionary<KT,VT>(泛型)。原因是没有web服务标准支持泛型标准。
其他回答
集合和泛型对于处理一组对象非常有用。在.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);
}
}
}
人们说字典和哈希表是一样的。
这不一定是真的。哈希表是实现字典的一种方法。这是一个典型的例子,它可能是.NET中Dictionary类中的默认例子,但根据定义,它不是唯一的例子。
你同样可以使用链接列表或搜索树来实现字典,但它并没有那么高效(对于一些高效的度量)。
仅供参考:在.NET中,Hashtable是线程安全的,可供多个读线程和一个写线程使用,而在Dictionary中,公共静态成员是线程安全,但不能保证任何实例成员都是线程安全。
因此,我们不得不将所有词典改回Hashtable。
字典:
如果我们试图找到不存在的键,它将返回/抛出异常。它比哈希表更快,因为没有装箱和拆箱。只有公共静态成员是线程安全的。字典是一种通用类型,这意味着我们可以将它与任何数据类型一起使用(创建时,必须为键和值指定数据类型)。示例:Dictionary<string,string><NameOfDictionaryVar>=新字典<string,string>();字典是Hashtable的类型安全实现,键和值是强类型的。
哈希表:
如果我们试图找到一个不存在的键,它将返回null。它比字典慢,因为它需要装箱和拆箱。Hashtable中的所有成员都是线程安全的,Hashtable不是泛型类型,哈希表是松散类型的数据结构,我们可以添加任何类型的键和值。
另一个重要的区别是Hashtable是线程安全的。Hashtable具有内置的多读取器/单写入器(MR/SW)线程安全性,这意味着Hashtable允许一个写入器与多个读取器一起使用,而无需锁定。
在Dictionary的情况下,没有线程安全;如果需要线程安全,则必须实现自己的同步。
进一步阐述:
Hashtable通过Synchronized属性提供了一些线程安全性,该属性返回集合周围的线程安全包装。包装器通过在每次添加或删除操作时锁定整个集合来工作。因此,每个试图访问集合的线程都必须等待轮到它获取一个锁。这是不可扩展的,可能会导致大型集合的性能显著下降。此外,该设计没有完全保护免受比赛条件的影响。.NET Framework 2.0集合类(如List<T>、Dictionary<TKey、TValue>等)不提供任何线程同步;当在多个线程上同时添加或删除项时,用户代码必须提供所有同步
如果需要类型安全和线程安全,请在.NETFramework中使用并发集合类。在这里进一步阅读。
另外一个区别是,当我们在字典中添加多个条目时,条目的添加顺序保持不变。当我们从字典中检索条目时,我们将按照插入它们的相同顺序获取记录。而Hashtable不保留插入顺序。
推荐文章
- 如何从枚举中选择一个随机值?
- 驻留在App_Code中的类不可访问
- 在链式LINQ扩展方法调用中等价于'let'关键字的代码
- dynamic (c# 4)和var之间的区别是什么?
- Visual Studio: ContextSwitchDeadlock
- 返回文件在ASP。Net Core Web API
- 自定义HttpClient请求头
- 如果我使用OWIN Startup.cs类并将所有配置移动到那里,我是否需要一个Global.asax.cs文件?
- VS2013外部构建错误"error MSB4019: The imported project <path> was not found"
- 从另一个列表id中排序一个列表
- 等待一个无效的异步方法
- 无法加载文件或程序集…参数不正确
- c#中枚举中的方法
- 如何从字符串中删除新的行字符?
- 如何设置一个默认值与Html.TextBoxFor?