繁体   English   中英

列表与字典(Hashtable)

[英]List vs Dictionary (Hashtable)

这可能是一个愚蠢的问题,但我读到HashtablesDictionaries比列表更快,因为他们用键索引项目。

我知道ListArray是针对没有值的元素,而Dictionary是针对具有值的元素。 因此,我认为拥有一个具有您需要的值作为键的Dictionary并且所有值都相等的Dictionary可能是明智的吗?

更新

基于评论,我认为我需要的是HashSet 这个问题谈到了他们的表现。

Dictionary / Hashtable与List /数组之间也存在一些缺点:

  • 您必须使用每次查找计算对象的哈希值。
  • 对于小型集合,迭代数组可能比计算该散列更快,特别是因为散列不能保证是唯一的1
  • 他们不擅长迭代项目列表。
  • 他们不擅长存储重复的条目(有时你合法地想要一个值在一个数组中多次显示)
  • 有时类型没有与之关联的好键

使用适合的情况。 有时这将是一个列表或一个数组。 有时它会是一个字典。 你几乎不应该再使用HashTable了(如果你真的不存储你正在存储的类型,则更喜欢Dictionary <KeyType,Object>)。

1它通常是唯一的,但由于冲突的可能性很小,因此集合必须在计算哈希值后检查存储桶。

“更快”取决于你需要它们。

.NET List只是连续内存的一块(这不是链接列表),这使得顺序访问非常有效(特别是当您考虑缓存和预取现代CPU的影响时)或“随机”通过已知的整数索引。 搜索或插入元素(特别是在中间) - 不是那么多。

Dictionary是一种关联数据结构 - 一个键可以是任何可哈希的(不仅仅是整数索引),但是元素不是以“有意义”的方式排序,而通过已知键的访问不如List的整数索引那么快。

因此,为工作选择合适的工具。

您的语句“列表或数组用于没有值的元素,而字典用于具有值的元素”,并非严格来说。

更准确地说,List是元素的集合,Hashtable或Dictionary是元素的集合以及用于访问每个元素的唯一键。

将列表用于极少数元素的集合,或者只需要访问整个集合,而不是集合中的单个元素。

当集合很大时和/或当您需要查找/访问集合的各个成员时,请使用Hashtable或Dictionary。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM