在 Java 中,List
是一个非常常用的接口,提供了有序、可重复的元素集合。List
接口有多个实现类,每个实现类都有其特定的特性和适用场景。以下是 Java 中主要实现了 List
接口的类及其详细介绍。
1. 常见的 List
实现类
1.1 ArrayList
-
简介:
- 基于动态数组实现。
- 提供快速的随机访问(
get
和set
操作时间复杂度为 O(1))。 - 适合频繁的读取操作,但在插入和删除时可能较慢,尤其是在列表中间位置。
-
特点:
- 动态扩容:当数组容量不足时,会自动扩展(通常是当前容量的 1.5 倍)。
- 允许
null
元素。 - 非同步:不适合多线程环境下的并发访问,除非外部同步。
-
示例:
import java.util.ArrayList; import java.util.List; public class ArrayListExample { public static void main(String[] args) { List<String> arrayList = new ArrayList<>(); arrayList.add("Apple"); arrayList.add("Banana"); arrayList.add("Cherry"); arrayList.add("Apple"); // 允许重复元素 System.out.println("ArrayList: " + arrayList); } }
输出:
ArrayList: [Apple, Banana, Cherry, Apple]
1.2 LinkedList
-
简介:
- 基于双向链表实现。
- 适合频繁的插入和删除操作,特别是在列表的开头和中间位置。
- 支持作为队列(FIFO)和双端队列(Deque)的实现。
-
特点:
- 插入和删除效率高:在已知位置的插入和删除操作时间复杂度为 O(1)。
- 随机访问较慢:
get
和set
操作时间复杂度为 O(n),因为需要遍历链表。 - 允许
null
元素。
-
示例:
import java.util.LinkedList; import java.util.List; public class LinkedListExample { public static void main(String[] args) { List<String> linkedList = new LinkedList<>(); linkedList.add("Apple"); linkedList.add("Banana"); linkedList.add("Cherry"); linkedList.add("Apple"); // 允许重复元素 System.out.println("LinkedList: " + linkedList); } }
输出:
LinkedList: [Apple, Banana, Cherry, Apple]
1.3 Vector
-
简介:
- 类似于
ArrayList
,也是基于动态数组实现。 - 是同步的,线程安全的。
- 适合需要线程安全的场景,但由于同步开销,性能略低于
ArrayList
。
- 类似于
-
特点:
- 同步:所有的公开方法都是同步的,适用于多线程环境。
- 动态扩容:默认扩容策略与
ArrayList
略有不同(通常是当前容量的两倍)。 - 允许
null
元素。
-
示例:
import java.util.List; import java.util.Vector; public class VectorExample { public static void main(String[] args) { List<String> vector = new Vector<>(); vector.add("Apple"); vector.add("Banana"); vector.add("Cherry"); vector.add("Apple"); // 允许重复元素 System.out.println("Vector: " + vector); } }
输出:
Vector: [Apple, Banana, Cherry, Apple]
1.4 Stack
-
简介:
- 继承自
Vector
,表示后进先出(LIFO)的堆栈。 - 提供了额外的方法,如
push
、pop
和peek
。
- 继承自
-
特点:
- 继承自
Vector
:具备线程安全性。 - LIFO 结构:适用于需要堆栈行为的场景。
- 已过时:由于继承自
Vector
,不推荐使用。Java 推荐使用Deque
接口及其实现类(如ArrayDeque
)来实现堆栈。
- 继承自
-
示例:
import java.util.Stack; public class StackExample { public static void main(String[] args) { Stack<String> stack = new Stack<>(); stack.push("Apple"); stack.push("Banana"); stack.push("Cherry"); System.out.println("Stack: " + stack); String top = stack.pop(); System.out