跳到主要内容

List 集合

List 集合是 Java 编程中使用最频繁🔥的集合接口。这个知识点非常重要,请一定要掌握熟练。


什么是 List 集合?

List 是 Java 集合框架(Collection Framework)中的一个接口,它继承自 Collection 接口。List 表示一个有序的、可重复的元素序列。

你可以通过索引(下标)访问 List 中的元素,索引从 0 开始(是不是感觉和数组一样?)。

List 的主要特点包括:

  • 元素是有序的(插入顺序保留)
  • 元素可以重复
  • 允许包含 null
  • 支持基于索引的访问和操作

与数组的区别

与数组的区别

最大的区别是:

1. 数组:数组的长度是固定的,不能动态扩容。
2. List:List 长度可变,可以动态扩容。


为什么要使用 List 集合?

List 集合在以下场景中非常有用:

  1. 需要保留元素的插入顺序
  2. 需要根据索引快速访问元素
  3. 需要存储重复的元素
  4. 需要动态扩容的数组(相比数组,List 长度可变,无需手动扩容)
  5. 提供了丰富的内置方法,如添加、删除、遍历、搜索等,大大简化开发

例如,如果你要存储一个班级的学生名单、一批订单信息、日志记录等,List 都是一个很好的选择。


常见的 List 集合实现类

Java 提供了多个 List 接口的实现类,常用的包括:

实现类特点
ArrayList基于动态数组,查询快(随机访问),增删慢(除非在尾部)
LinkedList基于双向链表,增删快(尤其在首尾),查询慢(需要遍历)
Vector线程安全的动态数组,性能较低,已被 Collections.synchronizedList 替代
Stack继承自 Vector,提供栈结构(LIFO)

✅ 在大多数场景中,ArrayList 是最常用的 List 实现。

ArrayList

ArrayListJava 中最常用的 List 实现🔥。

要点:

  1. ArrayList 是基于数组实现的,支持快速随机访问。RandomAccess 接口标识着该类支持快速随机访问。
  2. 数组的默认大小为 10
  3. oldCapacity + (oldCapacity >> 1) 新容量大约是旧容量的 1.5 倍左右。

LinkedList

LinkedList 是基于链表实现的,支持快速插入和删除。

要点:

  1. LinkedList是双向链表实现的List。
  2. LinkedList是非线程安全的。
  3. LinkedList元素允许为null,允许重复元素。
  4. LinkedList是基于链表实现的,因此插入删除效率高,查找效率低(虽然有一个加速动作)。
  5. LinkedList是基于链表实现的,因此不存在容量不足的问题,所以没有扩容的方法。
  6. 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();

经典源码分析

常见面试题