`可能是任何东西,但:)
@JosephHamilton:*implements*(或**的实现)甚至远不及*使用*.恰恰相反.如果他说的略有不同(但意思相同),也许会更清楚:"哈希表是实现字典的一种方式".也就是说,如果你想要字典的功能,那么一种方法(实现*字典)就是使用哈希表.
7> Sujit..:
Collections
&Generics
对于处理对象组很有用.在.NET中,所有集合对象都在接口之下,接口IEnumerable
又具有ArrayList(Index-Value))
&HashTable(Key-Value)
.在.NET framework 2.0之后,ArrayList
&HashTable
被替换为List
&Dictionary
.现在,在现在的项目中不再使用Arraylist
&HashTable
.
来到之间的区别HashTable
和Dictionary
,Dictionary
是通用的,其中如Hastable
不通用.我们可以添加任何类型的对象HashTable
,但在检索时我们需要将其强制转换为所需的类型.所以,它不是类型安全的.但是dictionary
,在声明自己时我们可以指定键和值的类型,因此在检索时不需要进行转换.
我们来看一个例子:
哈希表
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 dt = new Dictionary();
dt.Add(1, "One");
dt.Add(2, "Two");
dt.Add(3, "Three");
foreach (KeyValuePair kv in dt)
{
Console.WriteLine(kv.Key + " " + kv.Value);
}
}
}
而不是显式地为KeyValuePair分配数据类型,我们可以使用var.所以,这会减少输入 - foreach(在dt中的var kv)......只是一个建议.
8> Altaf Patel..:
字典:
如果我们试图找到一个不存在的密钥,它会返回/抛出异常.
它比Hashtable更快,因为没有装箱和拆箱.
只有公共静态成员是线程安全的.
Dictionary是一种泛型类型,这意味着我们可以将它与任何数据类型一起使用(创建时,必须指定键和值的数据类型).
例: Dictionary =
new Dictionary();
Dictionay是Hashtable的类型安全实现,Keys
并且Values
是强类型的.
哈希表:
如果我们试图找到一个不存在的密钥,它将返回null.
它比字典慢,因为它需要装箱和拆箱.
Hashtable中的所有成员都是线程安全的,
Hashtable不是通用类型,
Hashtable是松散类型的数据结构,我们可以添加任何类型的键和值.
9> alexandrekow..:
使用 MSDN上的C#文章对数据结构的广泛检查表明,冲突解决策略也存在差异 :
Hashtable类使用称为rehashing的技术.
Rehashing的工作原理如下:有一组散列不同的函数,H 1 ... H n,当从散列表中插入或检索项时,最初使用H 1散列函数.如果这导致碰撞,则尝试使用H 2,并且如果需要,则转发到H n.
字典使用称为链接的技术.
通过重新散列,在发生冲突时,重新计算散列,并尝试对应于散列的新槽.然而,通过链接,利用辅助数据结构来保持任何冲突.具体来说,Dictionary中的每个插槽都有一个映射到该存储桶的元素数组.如果发生碰撞,碰撞元素将被添加到桶的列表中.
10> Oliver..:
从.NET Framework 3.5开始HashSet
,Dictionary
如果只需要密钥而没有值,那么它还提供了所有优点.
因此,如果您使用a Dictionary
并始终将值设置null
为模拟类型安全哈希表,您应该考虑切换到HashSet
.
11> flesh..:
这Hashtable
是一个松散类型的数据结构,因此您可以将任何类型的键和值添加到Hashtable
.该Dictionary
班是一种安全的Hashtable
实现和键和值是强类型.创建Dictionary
实例时,必须为键和值指定数据类型.
12> 小智..:
请注意,MSDN说:"Dictionary <(Of <(TKey,TValue>)>)类实现为哈希表 ",而不是"Dictionary <(Of <(TKey,TValue>)>)类实现为HashTable "
Dictionary不是作为HashTable实现的,而是按照哈希表的概念实现的.由于使用了Generics,实现与HashTable类无关,尽管内部Microsoft可能使用了相同的代码并用TKey和TValue替换了Object类型的符号.
在.NET 1.0中,Generics不存在; 这是HashTable和ArrayList最初开始的地方.
13> Siva Sankar ..:
哈希表:
键/值将在存储到堆中时转换为对象(装箱)类型.
在从堆读取时,需要将键/值转换为所需的类型.
这些操作非常昂贵.我们需要尽可能避免装箱/拆箱.
字典: HashTable的通用变体.
没有拳击/拆箱.无需转换.
14> mparkuk..:
Hashtable对象由包含集合元素的存储桶组成.存储桶是Hashtable中虚拟的元素子组,与大多数集合相比,它使搜索和检索更容易,更快捷.
Dictionary类与Hashtable类具有相同的功能.特定类型的字典(除了Object)具有比值类型的Hashtable更好的性能,因为Hashtable的元素是Object类型,因此,如果存储或检索值类型,通常会发生装箱和取消装箱.
进一步阅读:Hashtable和字典集合类型
15> NullReferenc..:
另一个重要的区别是Hashtable是线程安全的.Hashtable内置多个读取器/单个写入器(MR/SW)线程安全性,这意味着Hashtable允许一个编写器与多个读取器一起使用而无需锁定.
在Dictionary的情况下,没有线程安全; 如果您需要线程安全,则必须实现自己的同步.
进一步阐述:
Hashtable通过Synchronized
属性提供一些线程安全性,它返回集合周围的线程安全包装器.包装器通过在每次添加或删除操作时锁定整个集合来工作.因此,尝试访问集合的每个线程必须等待轮到一个锁.这不可扩展,可能会导致大型集合的性能显着下降.此外,该设计并未完全免受竞争条件的影响.
.NET Framework 2.0集合类List, Dictionary
等不提供任何线程同步; 用户代码必须在多个线程上同时添加或删除项目时提供所有同步
如果您需要类型安全性以及线程安全性,请在.NET Framework中使用并发集合类.进一步阅读这里.
另一个区别是,当我们在Dictionary中添加多个条目时,将保留添加条目的顺序.当我们从Dictionary中检索项目时,我们将按照插入它们的相同顺序获取记录.而Hashtable不保留插入顺序.
“某些线程安全性”与“线程安全性”不同
16> 小智..:
我能想到的另一个不同之处是:
我们不能将Dictionary (泛型)与Web服务一起使用.原因是没有Web服务标准支持泛型标准.
17> Kishore Kuma..:
Dictionary<>
是一种通用类型,所以它的类型安全.
您可以在HashTable中插入任何值类型,这有时会引发异常.但是Dictionary
只接受整数值,同样Dictionary
只接受字符串.
因此,最好使用Dictionary<>
而不是HashTable
.