字符串数组和c#中的字符串列表有什么区别

时间:2011-04-25 11:04:15

标签: c# arrays string

我在MSDN听到数组比集合更快。

您能告诉我string[]List<string>.

更快吗?

5 个答案:

答案 0 :(得分:50)

数组是比列表等集合更低级的抽象。 CLR直接了解数组,因此在迭代,访问等方面的工作量略少。

然而,这应该永远决定你实际使用的是什么。在大多数实际应用中,性能差异可以忽略不计。我很少发现使用数组而不是各种泛型集合类是合适的,事实上有些人会考虑arrays somewhat harmful。一个重要的缺点是没有不可变数组(不是空数组)......而你可以通过API相对容易地公开只读集合。

答案 1 :(得分:9)

这篇文章是从2004年开始的,这意味着它是关于.net 1.1而且没有任何泛型。 数组与收集性能实际上是一个问题,因为集合类型导致了很多exta装箱拆箱操作。但是自从引入泛型的.net 2.0以来,性能上的差异几乎消失了。

答案 2 :(得分:6)

数组不可调整大小。这意味着在创建时会分配一块内存,大小足以容纳您指定的任意数量的元素。

另一方面,List可隐式调整大小。每次Add项时,框架可能需要分配更多内存来保存刚添加的项目。这是一个昂贵的操作,所以我们最终说“List比数组慢”。

当然这是一个非常简化的解释,但希望足以描绘出来。

答案 3 :(得分:3)

数组是最简单的集合形式,因此它比其他集合更快。 List(以及许多其他集合)实际上在内部使用数组来保存其项目。

阵列当然也受其简单性的限制。最值得注意的是,您无法更改数组的大小。如果您想要动态集合,可以使用List。

答案 4 :(得分:3)

List<string>是一个私有成员string[]的类。 MSDN文档在几个地方陈述了这一事实。 List类基本上是一个围绕数组的包装类,它为数组提供了其他功能。

答案更快取决于你要对列表/数组做什么。为了访问和赋值给元素,数组的速度可以忽略不计,因为List是数组的抽象(正如Jon Skeet所说)。

如果你打算让数据结构随着时间的推移而增长(获得越来越多的元素),那么性能(平均速度)明智的List将开始闪耀。这是因为每次调整数组大小以添加另一个元素时,都是O(n)操作。当您向List添加元素(并且列表已经处于容量状态)时,列表将自身加倍。我不会深入了解细节,但基本上这意味着增加List的大小平均是O(log n)操作。当然这也有缺点(如果你只是将一些项目超过其最后一个容量,你可以分配几乎两倍的内存量。)

编辑:我在上面的段落中有点混淆。正如Eric在下面所说,List的大小调整数是O(log n),但与调整数组大小相关的实际成本是分摊到O(1)。