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&lt;string&gt;()很丑,我更喜欢用string[],但是我不使用它,因为据我所知泛型性能更好,所以我使用它们。

string[]、int[] 或任何非泛型数组对应用程序有害吗?

我只是想知道数组和泛型集合之间的真正区别和影响。

编辑:

让我们假装一个场景

我必须调用这个方法,我应该使用string[]还是List&lt;string&gt;?什么更好?

static void PrintValues(IEnumerable<string> values) 
    foreach(var value in values) 
        Console.WriteLine(value);
    

【问题讨论】:

为什么这么丑?我有相反的意见。 @Ritch,如果您认为 List 非常简洁,那没关系。我的观点正好相反。 回复你的帖子,作为一个列表:values.ForEach(console.WriteLine)。作为一个数组,它的 Array.ForEach(values, console.WriteLine); 对不起,没有。我的问题不在于 ForEach。如您所见,我的方法接收没有 ForEach 方法的 IEnumerable,只有 List 和 Array 有。 【参考方案1】:

主要区别在于您可以向List&lt;T&gt; 添加新元素。

List&lt;T&gt; 在内部将元素存储在 T[] 类型的数组中,它只是在您添加新元素时自动分配一个更大的数组(或在您删除元素时缩小数组)。这意味着性能将大致相似。使用 List&lt;T&gt; 时有一些次要的间接性,但 JITter 可能会内联。

使用List&lt;T&gt; 的主要原因是它为您提供了更多功能——您可以添加和删除元素。

编辑在您使用PrintValues 的示例中,这并不重要。这取决于数据的来源。如果您只想使用一些固定参数调用它,您可以使用数组,因为它们更容易创建,例如new [] "hello", "world" .

在大多数实际场景中,您将从某个地方读取数据 - 如果您可以一次获取所有数据,那么您可以使用数组。如果您要一个接一个地阅读它们,那么您将使用List&lt;string&gt;,这样您就可以在阅读它们时添加元素。

【讨论】:

【参考方案2】:

要回答您编辑的问题,答案是:PrintValues 函数无关紧要。它会简单地迭代。

重要的是调用此函数的代码 - 它是如何得出要打印的值的?如果它们是一个相当静态的值列表,那么使用数组会更有效。如果需要构建或以其他方式操作集合,那么List&lt;T&gt;(或Stack&lt;T&gt; 或其他)可能会更好。

如果您使用的是 LINQ,您将更有可能使用 IEnumerable&lt;T&gt;,而不关心实际实现该接口的类型。

【讨论】:

【参考方案3】:

List&lt;T&gt; 基本上是数组T[] 的包装器,带有附加方法和IList&lt;T&gt; 的隐式实现。

另外,typeof(T[]).IsAssignableFrom(typeof(IList&lt;T&gt;)) == 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>> 有啥区别?

Rc<RefCell<T>> 和 RefCell<Rc<T>> 有啥区别?

< 和有啥区别?扩展基础> 和 <T 扩展基础>?