Java List集合 #
一、List接口 #
1.1 特点 #
- 有序集合
- 可以重复
- 可以通过索引访问
1.2 常用方法 #
java
List<String> list = new ArrayList<>();
// 添加元素
list.add("A");
list.add(0, "B"); // 在索引0处插入
// 获取元素
String s = list.get(0);
// 修改元素
list.set(0, "C");
// 删除元素
list.remove(0); // 按索引删除
list.remove("A"); // 按元素删除
// 查找
int index = list.indexOf("A");
int lastIndex = list.lastIndexOf("A");
// 子列表
List<String> subList = list.subList(0, 2);
二、ArrayList #
2.1 特点 #
- 底层是动态数组
- 随机访问快
- 增删慢(需要移动元素)
- 非线程安全
2.2 基本使用 #
java
// 创建
List<String> list = new ArrayList<>();
List<String> list2 = new ArrayList<>(16); // 指定初始容量
// 添加
list.add("A");
list.add("B");
list.add("C");
list.addAll(Arrays.asList("D", "E"));
// 遍历
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
for (String s : list) {
System.out.println(s);
}
list.forEach(System.out::println);
// 使用迭代器
Iterator<String> it = list.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
// 删除
list.remove(0);
list.remove("B");
list.clear();
// 判断
System.out.println(list.isEmpty());
System.out.println(list.contains("A"));
System.out.println(list.size());
2.3 常用操作 #
java
List<Integer> list = new ArrayList<>(Arrays.asList(3, 1, 4, 1, 5, 9));
// 排序
Collections.sort(list);
System.out.println(list); // [1, 1, 3, 4, 5, 9]
// 自定义排序
list.sort((a, b) -> b - a); // 降序
// 查找
int index = Collections.binarySearch(list, 4);
// 反转
Collections.reverse(list);
// 填充
Collections.fill(list, 0);
// 复制
List<Integer> copy = new ArrayList<>(list);
Collections.copy(copy, list);
// 转数组
Integer[] arr = list.toArray(new Integer[0]);
三、LinkedList #
3.1 特点 #
- 底层是双向链表
- 增删快
- 随机访问慢
- 可以作为队列使用
3.2 基本使用 #
java
LinkedList<String> list = new LinkedList<>();
// 添加
list.add("A");
list.addFirst("B"); // 添加到头部
list.addLast("C"); // 添加到尾部
// 获取
String first = list.getFirst();
String last = list.getLast();
// 删除
list.removeFirst();
list.removeLast();
// 栈操作
list.push("D"); // 入栈(添加到头部)
String top = list.pop(); // 出栈(从头部删除)
// 队列操作
list.offer("E"); // 入队(添加到尾部)
String head = list.poll(); // 出队(从头部删除)
3.3 作为队列使用 #
java
LinkedList<String> queue = new LinkedList<>();
// 入队
queue.offer("A");
queue.offer("B");
queue.offer("C");
// 出队
while (!queue.isEmpty()) {
System.out.println(queue.poll());
}
// 输出: A, B, C
四、ArrayList vs LinkedList #
4.1 性能对比 #
| 操作 | ArrayList | LinkedList |
|---|---|---|
| 随机访问 | O(1) | O(n) |
| 头部插入 | O(n) | O(1) |
| 尾部插入 | O(1) | O(1) |
| 中间插入 | O(n) | O(n) |
4.2 选择建议 #
java
// 随机访问多 → ArrayList
List<String> list1 = new ArrayList<>();
// 增删操作多 → LinkedList
List<String> list2 = new LinkedList<>();
五、List遍历方式 #
5.1 for循环 #
java
List<String> list = Arrays.asList("A", "B", "C");
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
5.2 增强for循环 #
java
for (String s : list) {
System.out.println(s);
}
5.3 迭代器 #
java
Iterator<String> it = list.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
// ListIterator:可以双向遍历
ListIterator<String> lit = list.listIterator();
while (lit.hasNext()) {
System.out.println(lit.next());
}
while (lit.hasPrevious()) {
System.out.println(lit.previous());
}
5.4 forEach方法 #
java
list.forEach(System.out::println);
// 或使用Lambda
list.forEach(s -> System.out.println(s));
5.5 Stream API #
java
list.stream()
.filter(s -> s.startsWith("A"))
.forEach(System.out::println);
六、注意事项 #
6.1 遍历时删除元素 #
java
List<String> list = new ArrayList<>(Arrays.asList("A", "B", "C"));
// 错误:ConcurrentModificationException
// for (String s : list) {
// if (s.equals("B")) {
// list.remove(s);
// }
// }
// 正确:使用迭代器
Iterator<String> it = list.iterator();
while (it.hasNext()) {
if (it.next().equals("B")) {
it.remove();
}
}
// 正确:使用removeIf(Java 8+)
list.removeIf(s -> s.equals("B"));
6.2 Arrays.asList陷阱 #
java
// 返回的List是固定大小的
List<String> list = Arrays.asList("A", "B", "C");
// 错误:UnsupportedOperationException
// list.add("D");
// list.remove(0);
// 正确:包装为ArrayList
List<String> arrayList = new ArrayList<>(Arrays.asList("A", "B", "C"));
arrayList.add("D"); // 正确
七、总结 #
| 实现 | 底层 | 随机访问 | 增删操作 |
|---|---|---|---|
| ArrayList | 数组 | 快 | 慢 |
| LinkedList | 链表 | 慢 | 快 |
List要点:
- ArrayList适合随机访问
- LinkedList适合增删操作
- 遍历时删除使用迭代器
- 注意Arrays.asList返回固定大小List
最后更新:2026-03-26