LinkedList和ArrayList有什么区别,什么时候使用哪一个?

时间:2010-04-20 16:54:28

标签: c#

LinkedListArrayList之间有什么区别?我怎么知道何时使用哪一个?

7 个答案:

答案 0 :(得分:12)

区别在于用于存储对象的内部数据结构。

ArrayList将使用系统数组(如Object[])并在需要时调整其大小。另一方面,LinkedList将使用包含数据的对象和指向列表中下一个和上一个对象的指针。

由于内部表示的这种差异,不同的操作将具有不同的算法复杂度。

答案 1 :(得分:11)

不要使用任何一种。使用System.Collections.Generic.List<T>

这真的是我的建议。可能与您的应用程序无关,但这里有一点颜色,以防您在这里做一些需要精心调整的选择。

ArrayListLinkedListList的存储机制的不同实现。 ArrayList使用的数组如果您的集合超出当前存储大小,则必须调整大小。另一方面,LinkedList使用来自CS 201的链表数据结构。LinkedList对于某些头部或尾部插入繁重的工作负载更好,但ArrayList对于随机访问工作负载更好。

答案 2 :(得分:9)

ArrayList 有一个很好的替代品List<T>

通常, List<T> 是数组的包装器 - 它允许索引和访问 O(1)中的项目,但是,每次超过必须支付 O(n)的容量。

LinkedList<T> 不允许您使用索引访问项目,但您可以计算该插入总是花费 O(1)。此外,您可以将项目插入到列表的开头以及 O(1)中的现有项目之间。

我认为在大多数情况下List<T>是默认选择。许多常见场景不需要特殊顺序,也没有严格的复杂性约束,因此List<T>是首选,因为它的使用简单。

答案 3 :(得分:4)

答案 4 :(得分:4)

ArrayListList<T>LinkedList<T>以及其他类似的Generics之间的主要区别在于ArrayList拥有Object s,而其他人拥有类型您指定的(即。List<Point>仅包含Points)。

因此,您需要将从ArrayList中取出的任何对象转换为其实际类型。如果您有长类名,这可能会占用大量屏幕空间。

一般情况下,使用List<T>和其他类型的泛型更好,除非你真的需要一个包含多种不同类型对象的列表。

答案 5 :(得分:3)

正如@sblom所说,使用LinkedList和ArrayList的通用对应物。没有理由不这样做,并有很多理由这样做。

列表&lt; T&gt;实现是有效地包装数组。如果用户试图在支持数组的边界之外插入元素,它将被复制到更大的数组(花费相当大,对List&lt; T&gt;的用户透明地编辑)

LinkedList&lt; T&gt;具有完全不同的实现,其中数据保存在LinkedListNode&lt; T&gt;中。实例,其携带对另外两个LinkedListNode&lt; T&gt;的引用。实例(或者在列表的头部或尾部只有一个实例)。不会创建对中间列表项的外部引用。这意味着迭代列表很快,但随机访问速度很慢,因为必须从一端或另一端迭代节点。使用LinkedList的最佳理由是允许快速插入,只需更改节点持有的引用,而不是重写整个列表以插入项目(如List&lt; T&gt;的情况)

答案 6 :(得分:2)

它们在“插入”(添加新元素)和查找方面具有不同的性能。对于插入,ArrayLists在内部保留一个数组(最初为16个项目),当达到最大容量时,它会使数组的大小加倍。 LinkedList开始为空,并在需要时添加项目(节点)。

我认为使用ArrayList你可以索引项目,而使用LinkedList你必须从头部“访问”该项目(或者LinkedList会自动为你做这个)。