ArrayList vs. LinkedList vs. Vector

小伙伴们注意了!

小编在这里给大家送上关注福利:

转发本文,关注+私信小编“资料”即可领取小编精心准备的资料一份!

1. 列表概述

List,顾名思义,是元素的有序序列。
当我们讨论List时,最好将它与Set(一组惟一的无序元素)进行比较。
下面是集合的类层次结构图。
从层次结构图中,您可以了解Java集合的一般概念。

2. ArrayList vs。LinkedList vs。Vector

在层次结构图中,它们都实现了List接口。
它们非常相似。
它们的主要区别在于它们的实现,这导致了不同操作的不同性能。

ArrayList实现为可调整大小的数组。
随着更多的元素被添加到ArrayList中,它的大小会动态增加。
它的元素可以通过使用get和set方法直接访问,因为ArrayList本质上是一个数组。

LinkedList实现为一个双链表。
它在添加和删除上的性能优于Arraylist,但在get和set方法上的性能则较差。

Vector与ArrayList类似,但它是同步的。

如果你的程序是线程安全的,ArrayList是一个更好的选择。
随着元素的增加,Vector和ArrayList需要更多的空间。
Vector每次都使其数组大小加倍,而ArrayList每次都增长其大小的50%。
LinkedList还实现了队列接口,它添加了比ArrayList和Vector更多的方法,如offer()、peek()、poll()等。

注意:ArrayList的默认初始容量非常小。
构造具有较高初始容量的ArrayList是一个好习惯。
这样可以避免调整大小的成本。

3.ArrayList的例子

4. LinkedList的例子

如上例所示,它们与use类似。
真正的区别在于它们的底层实现和操作复杂性。

5. 向量

Vector和ArrayList几乎是相同的,区别在于Vector是同步的。
因此,它的开销比ArrayList大。
通常,大多数Java程序员使用ArrayList而不是Vector,因为他们可以显式地自己同步。

6. ArrayList与LinkedList的性能

时间复杂度比较如下:

*表中的add()为add(E - E), remove()为remove(int index)

ArrayList对于任意的添加/删除索引具有O(n)的时间复杂度,但是对于列表末尾的操作具有O(1)的时间复杂度。
LinkedList对于任意的添加/删除索引具有O(n)的时间复杂度,但是对于列表末尾/开头的操作具有O(1)的时间复杂度。

我使用以下代码来测试它们的性能:

输出为:

他们的表现差异是明显的。
LinkedList在添加和删除方面更快,但在获取方面更慢。
根据复杂度表和测试结果,我们可以知道什么时候使用ArrayList或LinkedList。
简而言之,LinkedList应该是首选,如果::

元素没有大量的随机访问
有大量的添加/删除操作

最后,想学习Java的小伙伴们!

转发!

转发后关注+私信回复:“资料”就可以拿到一份我为大家准备的Java学习资料!

对Java感兴趣的小伙伴也可以加 小编V❤: suxuejava

猜你喜欢

转载自blog.csdn.net/suxue_java/article/details/88059899