List 集合
List 集合是 Java 编程中使用最频繁🔥的集合接口。这个知识点非常重要,请一定要掌握熟练。
什么是 List 集合?
List 是 Java 集合框架(Collection Framework)中的一个接口,它继承自 Collection
接口。List 表示一个有序的、可重复的元素序列。
你可以通过索引(下标)访问 List 中的元素,索引从 0 开始(是不是感觉和数组一样?)。
List 的主要特点包括:
- 元素是有序的(插入顺序保留)
- 元素可以重复
- 允许包含
null
值 - 支持基于索引的访问和操作
与数组的区别
最大的区别是:
1. 数组:数组的长度是固定的,不能动态扩容。
2. List:List 长度可变,可以动态扩容。
为什么要使用 List 集合?
List 集合在以下场景中非常有用:
- 需要保留元素的插入顺序
- 需要根据索引快速访问元素
- 需要存储重复的元素
- 需要动态扩容的数组(相比数组,List 长度可变,无需手动扩容)
- 提供了丰富的内置方法,如添加、删除、遍历、搜索等,大大简化开发
例如,如果你要存储一个班级的学生名单、一批订单信息、日志记录等,List 都是一个很好的选择。
常见的 List 集合实现类
Java 提供了多个 List 接口的实现类,常用的包括:
实现类 | 特点 |
---|---|
ArrayList | 基于动态数组,查询快(随机访问),增删慢(除非在尾部) |
LinkedList | 基于双向链表,增删快(尤其在首尾),查询慢(需要遍历) |
Vector | 线程安全的动态数组,性能较低,已被 Collections.synchronizedList 替代 |
Stack | 继承自 Vector ,提供栈结构(LIFO) |
✅ 在大多数场景中,
ArrayList
是最常用的 List 实现。
ArrayList
ArrayList
是 Java 中最常用的 List 实现🔥。
要点:
- ArrayList 是基于数组实现的,支持快速随机访问。RandomAccess 接口标识着该类支持快速随机访问。
- 数组的默认大小为 10。
- oldCapacity + (oldCapacity >> 1) 新容量大约是旧容量的 1.5 倍左右。
LinkedList
LinkedList
是基于链表实现的,支持快速插入和删除。
要点:
- LinkedList是双向链表实现的List。
- LinkedList是非线程安全的。
- LinkedList元素允许为null,允许重复元素。
- LinkedList是基于链表实现的,因此插入删除效率高,查找效率低(虽然有一个加速动作)。
- LinkedList是基于链表实现的,因此不存在容量不足的问题,所以没有扩容的方法。
- LinkedList还实现了栈和队列的操作方法,因此也可以作为栈、队列和双端队列来使用。
List 集合常用方法
以下列出 List 接口中常用的方法(以 ArrayList
为例):
1. 添加元素
list.add("A"); // 在末尾添加
list.add(0, "B"); // 在指定索引处插入
2. 获取元素
String element = list.get(0); // 获取指定索引的元素
3. 删除元素
list.remove(0); // 按索引删除
list.remove("A"); // 按元素值删除(首次出现)
4. 修改元素
list.set(0, "C"); // 将指定索引处的元素替换
5. 获取大小
int size = list.size();
6. 判断是否包含元素
boolean contains = list.contains("A");
7. 查找元素索引
int index = list.indexOf("A"); // 返回首次出现的索引,不存在返回 -1
8. 判断是否为空
boolean isEmpty = list.isEmpty();
9. 遍历 List
// 使用 for 循环
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
// 使用增强 for 循环
for (String item : list) {
System.out.println(item);
}
// 使用迭代器
Iterator<String> it = list.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
10. 转换为数组
String[] array = list.toArray(new String[0]);
11. 清空列表
list.clear();