T[] 和 List<T> 有啥区别?
Posted
技术标签:
【中文标题】T[] 和 List<T> 有啥区别?【英文标题】:What's the difference Between T[] and List<T>?T[] 和 List<T> 有什么区别? 【发布时间】:2011-03-04 01:05:51 【问题描述】:实际上我一直在使用泛型集合并且我经常使用列表。
有些场景我觉得new List<string>()
很丑,我更喜欢用string[]
,但是我不使用它,因为据我所知泛型性能更好,所以我使用它们。
string[]、int[] 或任何非泛型数组对应用程序有害吗?
我只是想知道数组和泛型集合之间的真正区别和影响。
编辑:
让我们假装一个场景
我必须调用这个方法,我应该使用string[]
还是List<string>
?什么更好?
static void PrintValues(IEnumerable<string> values)
foreach(var value in values)
Console.WriteLine(value);
【问题讨论】:
为什么这么丑?我有相反的意见。 @Ritch,如果您认为 List主要区别在于您可以向List<T>
添加新元素。
List<T>
在内部将元素存储在 T[]
类型的数组中,它只是在您添加新元素时自动分配一个更大的数组(或在您删除元素时缩小数组)。这意味着性能将大致相似。使用 List<T>
时有一些次要的间接性,但 JITter 可能会内联。
使用List<T>
的主要原因是它为您提供了更多功能——您可以添加和删除元素。
编辑在您使用PrintValues
的示例中,这并不重要。这取决于数据的来源。如果您只想使用一些固定参数调用它,您可以使用数组,因为它们更容易创建,例如new [] "hello", "world"
.
在大多数实际场景中,您将从某个地方读取数据 - 如果您可以一次获取所有数据,那么您可以使用数组。如果您要一个接一个地阅读它们,那么您将使用List<string>
,这样您就可以在阅读它们时添加元素。
【讨论】:
【参考方案2】:要回答您编辑的问题,答案是:PrintValues
函数无关紧要。它会简单地迭代。
重要的是调用此函数的代码 - 它是如何得出要打印的值的?如果它们是一个相当静态的值列表,那么使用数组会更有效。如果需要构建或以其他方式操作集合,那么List<T>
(或Stack<T>
或其他)可能会更好。
如果您使用的是 LINQ,您将更有可能使用 IEnumerable<T>
,而不关心实际实现该接口的类型。
【讨论】:
【参考方案3】:List<T>
基本上是数组T[]
的包装器,带有附加方法和IList<T>
的隐式实现。
另外,typeof(T[]).IsAssignableFrom(typeof(IList<T>)) == true
。
在我看来,数组的性能会比列表的性能更好,因为列表所做的一切,它都对数组做一些事情,而数组只是对自己做一些事情。
【讨论】:
【参考方案4】:我总是考虑在这两者之间进行选择,我也会给你添加一个新的。
数组:我只将它用于只读访问,因为随机访问是直接的。 ArrayList:使用内部按需增长的数组,因此它具有易于随机访问的优点,但如果数组在插入时已满,则必须分配一个新数组并复制所有元素。 LinkedList:非常适合插入,如果您想要随机访问,则应避免使用,因为它必须遍历所有元素,直到请求的元素。【讨论】:
【参考方案5】:数组是一种原始语言结构。这意味着,理论上,它们更有效。另一方面,它们的功能更少,允许不需要的操作,没有接口,具有有趣属性的多个实现......
除非您有非常严重的性能问题,否则请使用集合,而不是数组。
【讨论】:
没有接口?在 .Net 4.0 中,Array
实现 ICloneable, IList, ICollection, IEnumerable, IStructuralComparable, IStructuralEquatable
!
同意@Gabe。 CLR 中的数组不是原始构造,而且从来都不是。必须衡量效率,我相信根据使用情况,一个会胜过另一个。
数组确实是高效的——这是大多数其他数据结构(列表、字典、集合)在幕后使用的。不过,这并不意味着建立在它们之上的数据结构不是高效。以上是关于T[] 和 List<T> 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章
sizeof(T) 和 Unsafe.SizeOf<T>() 有啥区别?
await Task<T> 和 Task<T>.Result 有啥区别?
C# 7.2 中的 Span<T> 和 Memory<T> 有啥区别?
Rc<RefCell<T>> 和 RefCell<Rc<T>> 有啥区别?