ArrayList
和LinkedList
都实现了List
接口,它们的方法和结果几乎相同。然而,它们之间几乎没有差异,这取决于要求,使一个优于另一个。
ArrayList
与LinkedList
1)搜索:与LinkedList
搜索操作相比,ArrayList
搜索操作非常快。ArrayList
中的get(int index)
给出O(1)
的性能,而LinkedList
性能为O(n)
。
原因:ArrayList
维护其元素的基于索引的系统,因为它隐式使用数组数据结构,这使得搜索列表中的元素更快。另一方面,LinkedList
实现了双向链表,它需要遍历所有元素来搜索元素。
2)删除:LinkedList
删除操作给出O(1)
性能,而ArrayList
提供可变性能:在最坏的情况下O(n)
(删除第一个元素)和在最好的情况下O(1)
(删除最后一个元素)。
结论:与ArrayList
相比,LinkedList
元素删除更快。
原因:LinkedList
的每个元素都维护着两个指针(地址),这些指针指向列表中的两个邻居元素。因此,移除仅需要改变将要移除的节点的两个相邻节点(元素)中的指针位置。在ArrayList
中,需要移动所有元素以填充由要移除的元素创建的空间。
3)插入性能:LinkedList add
方法给出O(1)
性能,而ArrayList
在最坏情况下给出O(n)
。原因与删除说明相同。
4)内存开销:ArrayList
维护索引和元素数据,而LinkedList
维护元素数据和相邻节点的两个指针,因此LinkedList
中的内存消耗比较高。
这些类之间的相似性很少,如下所示:
ArrayList
和LinkedList
都是List
接口的实现。- 它们都维护元素的插入顺序,这意味着在显示
ArrayList
和LinkedList
元素时,结果集将具有将元素插入List
的相同顺序。 - 这两个类都是非同步的,可以使用
Collections.synchronizedList
方法显式同步。 - 这些类返回的迭代器和
listIterator
是快速失败的(如果在创建迭代器之后的任何时候对列表进行结构修改,除非通过迭代器自己的remove
或add
方法,迭代器将抛出ConcurrentModificationException
)。
何时使用LinkedList
以及何时使用ArrayList
?
1)如上所述,与 ArrayList(O(n)
)相比,insertList
和remove
操作在LinkedList
中提供了良好的性能(O(1)
)。因此,如果在应用中需要频繁添加和删除,则LinkedList
是最佳选择。
2)搜索(get
方法)操作在Arraylist
(O(1)
)中很快但在LinkedList
(O(n)
中)没有,因此如果添加和删除操作较少且搜索操作要求较多,则ArrayList
将是您最好的选择。