【问题标题】:When will one prefer array, LinkedList or ArrayList over List<T>?什么时候会比 List<T> 更喜欢数组、LinkedList 或 ArrayList?
【发布时间】:2020-12-26 16:01:27
【问题描述】:

除了遗留代码之外,使用这些数据类型有什么意义吗?可以理解使用其他数据类型(如 Dictionary 或 Graph),因为它们提供额外/不同的功能。但是数组、LinkedList 或 ArrayList 的功能较少,有时性能比 List 更差(ArrayList 在值类型中的内存效率较低)

那为什么还要使用它们呢?

注意:这不是一个基于意见的问题。我只想知道这些类型的用例

另一个注意事项:我知道链表的 O(1) 插入时间。我在问什么时候应该在具有 O(1) 访问时间的标准列表上使用它? 什么时候使用比较好? (关于 ArrayList 和数组的问题仍然存在)

【问题讨论】:

  • 所有容器都有优点和缺点......从复杂性 O(n) 到排序功能

标签: c# arrays list arraylist linked-list


【解决方案1】:

LinkedList

这里列出了与 List 实现的区别。当列表中的项目需要保持特定顺序时使用它(因此是下一个和上一个引用)。

表示一个双向链表。

LinkedList&lt;T&gt; 提供LinkedListNode&lt;T&gt; 类型的单独节点,因此插入和删除是 O(1) 操作。

您可以在同一个列表或另一个列表中删除节点并重新插入它们,这样就不会在堆上分配额外的对象。因为列表还维护一个内部计数,所以获取 Count 属性是一个 O(1) 操作。

LinkedList&lt;T&gt; 对象中的每个节点都属于LinkedListNode&lt;T&gt; 类型。因为LinkedList&lt;T&gt;是双向链接的,所以每个节点都向前指向Next节点,向后指向Previous节点。

List Vs ArrayList

ArrayList 是过去使用的已弃用实现。在任何新代码中首选List&lt;T&gt; 泛型实现。

List&lt;T&gt;作为一个泛型集合,实现了泛型IEnumerable&lt;T&gt;接口,可以在LINQ中轻松使用

ArrayList 属于 C# 没有泛型的时代。它已弃用,取而代之的是 List&lt;T&gt;。您不应在以 .NET >= 2.0 为目标的新代码中使用 ArrayList,除非您必须与使用它的旧 API 交互。

Array vs List

数组是一个固定大小的集合,它支持多个维度。对于简单的插入和迭代,它是三者中效率最高的。

【讨论】:

    【解决方案2】:

    ArrayList?确定:基本上永远不要使用它(除非你不想迁移一些遗留代码,或者因为有人不明智地使用了BinaryFormatter而不能迁移)。

    然而,

    LinkedList&lt;T&gt; 不在同一类别中 - 它是 niche,但由于插入/删除/等成本低廉,它具有用途,与需要移动数据的 List&lt;T&gt; 不同周围执行插入/删除。在大多数情况下,您可能不需要该功能,因此:除非您这样做,否则不要使用它?

    【讨论】:

    • 但你是指哪个List&lt;T&gt;?不能实例化 List,所以没有 List
    • @Omid.N um...是的,你可以(实例化List&lt;T&gt;);不是abstract(你在想Java吗?注意这个问题有一个C#标签,所以我在这里说的是.NET)
    • 啊!抱歉,我认为这是一个 java 问题。
    猜你喜欢
    • 1970-01-01
    • 2013-03-25
    • 2016-05-20
    • 2017-08-04
    • 2011-03-20
    • 2010-09-20
    • 2010-11-20
    • 1970-01-01
    • 2011-05-10
    相关资源
    最近更新 更多