Java List 接口及其实现类对比
List 接口是 Java 集合框架中的一种有序集合,它允许元素按插入顺序存储,并且可以通过索引(角标)访问元素。元素可以重复,适合存储多个相同的元素。List 接口的常见实现类有 Vector、ArrayList 和 LinkedList,它们各自具有不同的特性和适用场景。本文将对这三者进行详细对比。
1. Vector
- 数据结构:内部使用数组来存储数据。
- 线程安全:是同步的,意味着它的操作是线程安全的。
- 性能:由于同步机制,Vector 的增删和查询操作通常较慢。增删时需要锁定整个对象,因此多线程环境下有较高的性能开销。
- 特点:每次容量增长为原来的一倍(100%扩展)。由于同步开销及容量增长的设计,Vector 已经不常用,通常被认为是过时的类。
2. ArrayList
-
数据结构:内部使用数组来存储数据。
-
线程安全:ArrayList 是不同步的,不保证线程安全,因此在多线程环境下使用时需要额外的同步控制。
-
性能:
- 查询:由于数组的内存是连续分配的,所以通过索引,可以直接找到内存地址,从而找到实际元素,ArrayList 在查询操作上相对较快。查询时通过数组的索引直接访问元素,时间复杂度为 O(1)。
- 增删:增删操作较慢,因为数组的大小是固定的,插入或删除元素时,可能需要移动大量元素。删除和插入元素的时间复杂度为 O(n)。
-
特点:查询操作性能较高,适用于查询频繁且不常修改的场景。
3. LinkedList
-
数据结构:内部使用链表(双向链表)来存储数据。
-
线程安全:LinkedList 是不同步的,操作时不保证线程安全。
-
性能:
- 查询:由于链表是由节点连接而成,内存是非连续的,因此查询操作较慢。为了找到特定的元素,可能需要遍历链表。查询时间复杂度为 O(n)。
- 增删:增删操作速度非常快。由于链表的内存空间不连续,元素的插入和删除仅需要改变相应节点的指针即可,无需移动其他元素。因此,增删操作的时间复杂度为 O(1)。
-
特点:LinkedList 适用于频繁进行增删操作的场景,如队列或栈的实现。