LinkedList
和ArrayList
之间有什么区别?我怎么知道何时使用哪一个?
答案 0 :(得分:12)
区别在于用于存储对象的内部数据结构。
ArrayList
将使用系统数组(如Object[]
)并在需要时调整其大小。另一方面,LinkedList
将使用包含数据的对象和指向列表中下一个和上一个对象的指针。
由于内部表示的这种差异,不同的操作将具有不同的算法复杂度。
答案 1 :(得分:11)
不要使用任何一种。使用System.Collections.Generic.List<T>
。
这真的是我的建议。可能与您的应用程序无关,但这里有一点颜色,以防您在这里做一些需要精心调整的选择。
ArrayList
和LinkedList
是List
的存储机制的不同实现。 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)
ArrayList
和List<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会自动为你做这个)。