c#中字符串数组和字符串列表的区别是什么?
本文关键字:字符串 区别 是什么 数组 列表 | 更新日期: 2023-09-27 17:52:42
我在MSDN上听说数组比集合快。
你能告诉我string[]
为什么比List<string>.
快吗
数组是比集合(如列表)更低级的抽象。CLR直接知道数组,所以在迭代、访问等方面所涉及的工作稍微少一些。
然而,这几乎不应该指示您实际使用哪个。在大多数实际应用程序中,性能差异可以忽略不计。我很少发现使用数组而不是各种泛型集合类是合适的,而且确实有些人认为数组有些有害。一个重要的缺点是没有不可变数组(除了空数组)……而你可以通过API相对容易地公开只读集合
数组不能调整大小。这意味着当它被创建时,分配一个足够大的内存块,可以容纳您指定的任意数量的元素。
另一方面,List
是隐式可调整大小的。每次您Add
一个项时,框架可能需要分配更多的内存来保存您刚刚添加的项。这是一个昂贵的操作,所以我们最后说"List比array慢"。
当然,这是一个非常简单的解释,但希望足以描绘出整个画面。
这篇文章来自2004年,这意味着它是关于。net 1.1的,没有泛型。数组与集合的性能实际上在当时是一个问题,因为集合类型会导致大量额外的装箱-拆箱操作。但是自从。net 2.0引入了泛型之后,性能上的差异几乎消失了。
数组是集合的最简单形式,因此它比其他集合更快。List(和许多其他集合)实际上在内部使用数组来保存它的项。
数组当然也受到其简单性的限制。最明显的是,你不能改变数组的大小。如果你想要一个动态集合,你可以使用List。
List<string>
是一个私有成员为string[]
的类。MSDN文档在几个地方说明了这一事实。List类基本上是数组的包装类,它为数组提供了其他功能。
哪个更快的答案完全取决于你想用列表/数组做什么。对于元素的访问和赋值,数组可能要快得多,因为List是数组的抽象(正如Jon Skeet所说)。
如果你打算拥有一个随时间增长的数据结构(获得越来越多的元素),那么List将开始发光。这是因为每次调整数组大小以添加另一个元素时,都是一个O(n)操作。当你向List中添加一个元素时(而List的容量已经满了),List的大小会增加一倍。我不会深入细节,但基本上这意味着增加List的大小平均是一个O(log n)的操作。当然,这也有缺点(如果您只处理超过最后容量的几个项目,则分配的内存量可能几乎是您真正需要的两倍)。
编辑:我在上面的段落中有点混淆。正如Eric在下面所说的,List的大小调整次数是O(log n),但是与数组大小调整相关的实际成本是平摊到O(1)。