在大多数编程语言中,字典比哈希表更受欢迎。这背后的原因是什么?
当前回答
哈希表:
键/值将在存储到堆中时转换为对象(装箱)类型。
从堆中读取时,需要将键/值转换为所需的类型。
这些操作成本很高。我们需要尽可能避免装箱/拆箱。
字典:HashTable的泛型变体。
禁止装箱/拆箱。无需转换。
其他回答
仅供参考:在.NET中,Hashtable是线程安全的,可供多个读线程和一个写线程使用,而在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);
}
}
}
字典:
如果我们试图找到不存在的键,它将返回/抛出异常。它比哈希表更快,因为没有装箱和拆箱。只有公共静态成员是线程安全的。字典是一种通用类型,这意味着我们可以将它与任何数据类型一起使用(创建时,必须为键和值指定数据类型)。示例:Dictionary<string,string><NameOfDictionaryVar>=新字典<string,string>();字典是Hashtable的类型安全实现,键和值是强类型的。
哈希表:
如果我们试图找到一个不存在的键,它将返回null。它比字典慢,因为它需要装箱和拆箱。Hashtable中的所有成员都是线程安全的,Hashtable不是泛型类型,哈希表是松散类型的数据结构,我们可以添加任何类型的键和值。
注意,文档中说:“Dictionary<(Of<(TKey,TValue>)>)类是作为哈希表实现的”,而不是“Dictionary<(Of<(TKey,TValue>)>类是作为HashTable实现的”
字典没有实现为哈希表,但它是按照哈希表的概念实现的。由于使用了泛型,该实现与HashTable类无关,尽管微软内部可能使用了相同的代码,并用TKey和TValue替换了Object类型的符号。
在.NET 1.0中,泛型不存在;这是HashTable和ArrayList最初开始的地方。
因为Dictionary是一个泛型类(Dictionary<TKey,TValue>),所以访问其内容是类型安全的(即,不需要像Hashtable那样从Object转换)。
比较
var customers = new Dictionary<string, Customer>();
...
Customer customer = customers["Ali G"];
to
var customers = new Hashtable();
...
Customer customer = customers["Ali G"] as Customer;
然而,Dictionary在内部实现为哈希表,因此技术上它的工作方式相同。
推荐文章
- PowerShell脚本在机器上返回。net框架的版本?
- 在哪些领域使用f#比c#更合适?
- 用c#创建一个空文件
- 如何改变列表<T>数据IQueryable<T>数据
- 数组与链表
- 您可以使用反射来查找当前正在执行的方法的名称吗?
- 流。Seek(0, SeekOrigin.Begin)或Position = 0
- 如果查询为空,则最大返回值
- "输出类型为类库的项目不能直接启动"
- 传递一个实例化的系统。类型作为泛型类的类型参数
- 从SqlCommand对象获取生成的SQL语句?
- 把内容放在HttpResponseMessage对象?
- 在c#中转换字符串为类型
- 如何比较单元测试中的列表
- 替换c#字符串中的多个字符