List概述
List,顾名思义,是一个有序的元素序列。 当我们谈论 List 时,最好将它与 Set 进行比较,Set 是一组唯一且无序的元素。 下面是Collection的类层次图。 从层次结构图中,您可以大致了解 Java 集合。
Arraylist、LinkedList和Vector对比
从层次图中,它们都实现了List接口。 它们使用起来非常相似。 它们的主要区别在于它们的实现导致不同操作的不同性能。
ArrayList 被实现为一个可调整大小的数组。 随着更多元素添加到 ArrayList,它的大小会动态增加。 它的元素可以通过使用 get 和 set 方法直接访问,因为 ArrayList 本质上是一个数组。
LinkedList 实现为双链表。 它在 add 和 remove 上的性能优于 Arraylist,但在 get 和 set 方法上更差。
Vector 与 ArrayList 类似,但它是同步的。
如果您的程序是线程安全的,则 ArrayList 是更好的选择。 随着更多元素的添加,Vector 和 ArrayList 需要更多空间。 Vector 每次都会使其数组大小翻倍,而 ArrayList 每次都会增长 50% 的大小。 LinkedList 也实现了 Queue 接口,它比 ArrayList 和 Vector 添加了更多的方法,例如 offer()、peek()、poll() 等。
注意:ArrayList 的默认初始容量非常小。 构造具有更高初始容量的 ArrayList 是一个好习惯。 这可以避免调整大小的成本。
Vector与ArrayList几乎相同,不同的是Vector是同步的。 因此,它比 ArrayList 需要更大开销。 通常,大多数 Java 程序员使用 ArrayList 而不是 Vector,因为他们可以自己显式同步。
LinkedList 的 add 和 remove 速度更快,但 get 速度较慢。 根据复杂度表和测试结果,我们可以判断何时使用 ArrayList 或 LinkedList。 简而言之,如果出现以下情况,应该首选 LinkedList:
- 没有大量随机访问元素
- 有大量的添加/删除操作