string数组和c#中的string列表有什么区别
我听到MSDN上的数组比集合更快。
你能告诉我string[]
比List<string>.
快吗List<string>.
数组是比列表等集合更低级别的抽象。 CLR直接了解数组,所以在迭代,访问等方面涉及的工作稍微less一些。
但是,这应该几乎不会决定你实际使用哪一个。 在大多数现实世界的应用程序中,性能差异可以忽略不计。 我很less发现使用数组而不是各种通用集合类是合适的,事实上有些人认为数组有些有害 。 一个重要的缺点是,不存在不可变数组(而不是空数组),而您可以通过API相对容易地公开只读集合。
这篇文章是从2004年开始的,这意味着它是关于.net 1.1的 ,没有generics。 实际上,数组与集合的性能实际上是一个问题,因为集合types导致了大量的exta boxing-unboxing操作。 但是自引入generics的.net 2.0以来,性能差异几乎消失了。
数组不可resize。 这意味着当它被创build时,一块内存被分配,足够大以容纳你指定的元素。
另一方面, List
可以隐式resize。 每次Add
一个项目时,框架可能都需要分配更多的内存来保存刚刚添加的项目。 这是一个昂贵的操作,所以我们最终说“列表比数组慢”。
当然这是一个非常简单的解释,但希望足以描绘这幅画。
数组是最简单的收集forms,所以它比其他收集更快。 List(和其他许多集合)实际上在内部使用一个数组来保存它的项目。
一个数组当然也受其简单性的限制。 最值得注意的是你不能改变数组的大小。 如果你想要一个dynamic集合,你可以使用一个List。
List<string>
是具有私有成员的类,它是一个string[]
。 MSDN文档在几个地方陈述了这个事实。 List类基本上是一个数组的包装类,它为数组提供了其他function。
答案是更快的全部取决于你想要做什么与列表/数组。 为了访问和赋值给元素,数组可能会快得多,因为List是数组的抽象(就像Jon Skeet所说的那样)。
如果你打算有一个随着时间的推移而增长的数据结构(获得越来越多的元素),明智的性能(ave。speed)将开始闪耀。 这是因为每次调整数组大小以添加另一个元素时,都是O(n)操作。 当你添加一个元素到一个List(并且列表已经在容量)时,这个列表的大小将自动加倍。 我不会深入细节,但基本上这意味着增加List的大小平均是O(log n)操作。 当然这也有一些缺点(如果你只有几个项目超过最后的容量,你可能会有几乎两倍的内存分配量)。
编辑:我在上面的段落有点混淆。 正如Eric在下面所说的,列表的resize为O(log n),但调整数组大小的实际成本将分摊到O(1)。
一个数组是RAM中的一个连续的存储区域。 列表可以通过使用数组或通过使用引用组合列表的元素来创build。 访问连续内存中的内存元素比访问列表元素更快速地访问不同的内存位置。