List与ArrayList
ArrayList是最常用的集合,本课学习List的详细用法。
ArrayList
ArrayList是基于数组实现的动态数组。
特点
| 特点 | 说明 |
|---|---|
| 有序 | 元素按插入顺序排列 |
| 可重复 | 可以有相同元素 |
| 索引访问 | 通过索引访问元素 |
| 动态增长 | 自动扩容 |
创建ArrayList
JAVA
import java.util.ArrayList;
import java.util.List;
// 方式1:默认容量
List<String> list1 = new ArrayList<>();
// 方式2:指定容量
List<String> list2 = new ArrayList<>(100);
// 方式3:从其他集合创建
List<String> list3 = new ArrayList<>(list1);
基本操作
添加元素
JAVA
List<String> list = new ArrayList<>();
list.add("Alice"); // 添加到末尾
list.add("Bob");
list.add(0, "Charlie"); // 添加到指定位置
System.out.println(list); // [Charlie, Alice, Bob]
获取元素
JAVA
List<String> list = new ArrayList<>();
list.add("Alice");
list.add("Bob");
String first = list.get(0); // Alice
int size = list.size(); // 2
修改元素
JAVA
List<String> list = new ArrayList<>();
list.add("Alice");
list.add("Bob");
list.set(0, "Charlie"); // 把第一个元素改为Charlie
System.out.println(list); // [Charlie, Bob]
删除元素
JAVA
List<String> list = new ArrayList<>();
list.add("Alice");
list.add("Bob");
list.add("Charlie");
list.remove(0); // 按索引删除
list.remove("Bob"); // 按内容删除
System.out.println(list); // [Charlie]
查找元素
JAVA
List<String> list = new ArrayList<>();
list.add("Alice");
list.add("Bob");
list.add("Charlie");
boolean has = list.contains("Bob"); // true
int index = list.indexOf("Charlie"); // 2
int lastIndex = list.lastIndexOf("Alice"); // 0
遍历方式
方式1:for循环
JAVA
List<String> list = new ArrayList<>();
list.add("Alice");
list.add("Bob");
list.add("Charlie");
for (int i = 0; i < list.size(); i++) {
System.out.println(i + ": " + list.get(i));
}
方式2:for-each
JAVA
for (String name : list) {
System.out.println(name);
}
方式3:Iterator
JAVA
Iterator<String> it = list.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
方式4:Lambda
JAVA
list.forEach(name -> System.out.println(name));
list.forEach(System.out::println);
排序
使用Collections.sort()
JAVA
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
List<Integer> numbers = new ArrayList<>();
numbers.add(3);
numbers.add(1);
numbers.add(4);
numbers.add(1);
numbers.add(5);
Collections.sort(numbers); // 升序
System.out.println(numbers); // [1, 1, 3, 4, 5]
Collections.sort(numbers, Collections.reverseOrder()); // 降序
System.out.println(numbers); // [5, 4, 3, 1, 1]
使用Comparator
JAVA
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
List<String> names = new ArrayList<>();
names.add("Charlie");
names.add("Alice");
names.add("Bob");
// 按字母顺序
names.sort((a, b) -> a.compareTo(b));
System.out.println(names); // [Alice, Bob, Charlie]
// 按长度
names.sort(Comparator.comparingInt(String::length));
System.out.println(names); // [Bob, Alice, Charlie]
其他常用方法
| 方法 | 说明 |
|---|---|
addAll(Collection) |
添加所有元素 |
removeAll(Collection) |
删除所有匹配元素 |
retainAll(Collection) |
保留交集 |
clear() |
清空 |
isEmpty() |
是否为空 |
toArray() |
转数组 |
subList(int, int) |
截取子列表 |
示例:批量操作
JAVA
List<String> list1 = new ArrayList<>();
list1.add("A");
list1.add("B");
list1.add("C");
List<String> list2 = new ArrayList<>();
list2.add("B");
list2.add("C");
list2.add("D");
// 并集
List<String> union = new ArrayList<>(list1);
union.addAll(list2);
System.out.println("并集:" + union); // [A, B, C, B, C, D]
// 交集
List<String> intersection = new ArrayList<>(list1);
intersection.retainAll(list2);
System.out.println("交集:" + intersection); // [B, C]
// 差集
List<String> diff = new ArrayList<>(list1);
diff.removeAll(list2);
System.out.println("差集:" + diff); // [A]
LinkedList
LinkedList是基于双向链表实现的List。
特点
| 特点 | ArrayList | LinkedList |
|---|---|---|
| 底层结构 | 数组 | 双向链表 |
| 随机访问 | O(1) | O(n) |
| 头部插入 | O(n) | O(1) |
| 尾部插入 | O(1) | O(1) |
| 内存占用 | 较少 | 较多(指针) |
LinkedList特有方法
JAVA
LinkedList<String> linkedList = new LinkedList<>();
// 头尾操作
linkedList.addFirst("A");
linkedList.addLast("B");
linkedList.addLast("C");
String first = linkedList.getFirst();
String last = linkedList.getLast();
linkedList.removeFirst();
linkedList.removeLast();
选择建议
| 场景 | 推荐 |
|---|---|
| 频繁随机访问 | ArrayList |
| 频繁头部插入/删除 | LinkedList |
| 一般场景 | ArrayList |
示例:学生成绩管理
JAVA
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
public class StudentGrade {
private String name;
private int score;
public StudentGrade(String name, int score) {
this.name = name;
this.score = score;
}
public String getName() { return name; }
public int getScore() { return score; }
@Override
public String toString() {
return name + ": " + score;
}
public static void main(String[] args) {
List<StudentGrade> students = new ArrayList<>();
students.add(new StudentGrade("Alice", 95));
students.add(new StudentGrade("Bob", 88));
students.add(new StudentGrade("Charlie", 92));
students.add(new StudentGrade("David", 85));
// 按成绩降序
students.sort((a, b) -> b.getScore() - a.getScore());
System.out.println("按成绩排序:");
students.forEach(System.out::println);
// 找最高分
StudentGrade top = students.stream()
.max(Comparator.comparingInt(StudentGrade::getScore))
.orElse(null);
System.out.println("最高分:" + top);
// 计算平均分
double avg = students.stream()
.mapToInt(StudentGrade::getScore)
.average()
.orElse(0);
System.out.printf("平均分:%.1f%n", avg);
}
}
❓ 常见问题
Q ArrayList初始容量是多少?
A 默认10。如果知道大概数量,可以在构造方法中指定,减少扩容次数。
Q ArrayList扩容机制是什么?
A 每次扩容为原来的1.5倍。
Q List可以存储null吗?
A ArrayList和LinkedList都可以存储null。
📖 小节
- ArrayList基于数组,查询快,增删慢
- LinkedList基于链表,增删快,查询慢
- 常用操作:add/get/set/remove/contains/sort
- 遍历方式:for/for-each/Iterator/Lambda
📝 作业
- 去重: 将ArrayList中的重复元素去除
- 合并: 合并两个有序List为一个有序List
- 统计: 统计List中每个元素出现的次数
下一课
下一课我们将学习 Set与HashSet,了解Set的去重原理。



