Java List 集合详解
List 是 Java 集合框架中的一个接口,继承自 Collection,允许存储重复元素,并且保持元素的插入顺序。它是有序的,并提供了基于索引的操作,可以随时访问、插入或删除元素。
✅ 1. List 的特点
- 有序性:
List 保证元素的存储顺序与插入顺序相同。
- 允许重复元素:
List 允许多个元素具有相同的值。
- 索引访问:可以使用
get(int index) 通过索引访问元素。
- 支持
null 值:可以存储 null。
✅ 2. List 的主要实现类
| 实现类 |
底层数据结构 |
特点 |
ArrayList |
动态数组 |
读取快,增删慢(基于数组) |
LinkedList |
双向链表 |
增删快,读取慢(基于链表) |
Vector |
动态数组(线程安全) |
线程安全,但性能较低 |
Stack |
栈(继承 Vector) |
先进后出(LIFO) |
✅ 3. List 的常用方法
List 继承了 Collection 的方法,并额外提供了一些基于索引的操作方法:
| 方法 |
作用 |
add(E e) |
添加元素 |
add(int index, E element) |
在指定位置插入元素 |
remove(int index) |
根据索引删除元素 |
remove(Object o) |
删除匹配的第一个元素 |
set(int index, E element) |
修改指定索引位置的元素 |
get(int index) |
获取指定索引的元素 |
indexOf(Object o) |
返回元素的索引(首次出现) |
lastIndexOf(Object o) |
返回元素的索引(最后出现) |
subList(int fromIndex, int toIndex) |
获取子列表 |
sort(Comparator<? super E> c) |
对 List 进行排序 |
replaceAll(UnaryOperator<E> operator) |
替换所有元素 |
✅ 4. ArrayList 用法
4.1 创建 ArrayList
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| import java.util.ArrayList; import java.util.List;
public class ArrayListExample { public static void main(String[] args) { List<String> list = new ArrayList<>(); list.add("Java"); list.add("Python"); list.add("C++");
System.out.println(list); } }
|
4.2 按索引操作
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| import java.util.ArrayList; import java.util.List;
public class ArrayListIndexExample { public static void main(String[] args) { List<String> list = new ArrayList<>(); list.add("Java"); list.add("Python"); list.add("C++");
System.out.println(list.get(1));
list.set(1, "JavaScript"); System.out.println(list);
list.remove(2); System.out.println(list); } }
|
4.3 遍历 ArrayList
方式 1:普通 for 循环
1 2 3
| for (int i = 0; i < list.size(); i++) { System.out.println(list.get(i)); }
|
方式 2:增强 for 循环
1 2 3
| for (String item : list) { System.out.println(item); }
|
方式 3:Iterator 遍历
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| import java.util.Iterator; import java.util.List; import java.util.ArrayList;
public class IteratorExample { public static void main(String[] args) { List<String> list = new ArrayList<>(); list.add("Java"); list.add("Python"); list.add("C++");
Iterator<String> iterator = list.iterator(); while (iterator.hasNext()) { System.out.println(iterator.next()); } } }
|
方式 4:Lambda 表达式
1
| list.forEach(System.out::println);
|
4.4 排序 ArrayList
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| import java.util.ArrayList; import java.util.Collections; import java.util.List;
public class ListSortExample { public static void main(String[] args) { List<Integer> list = new ArrayList<>(); list.add(5); list.add(2); list.add(8); list.add(1);
Collections.sort(list); System.out.println(list);
list.sort(Collections.reverseOrder()); System.out.println(list); } }
|
✅ 5. LinkedList 用法
LinkedList 适用于频繁的插入和删除操作。
5.1 LinkedList 特性
- 基于双向链表,插入/删除操作比
ArrayList 更快。
- 适用于队列(FIFO)和栈(LIFO)结构。
- 支持头尾操作(
addFirst()、addLast()、removeFirst()、removeLast())。
5.2 LinkedList 示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| import java.util.LinkedList; import java.util.List;
public class LinkedListExample { public static void main(String[] args) { List<String> list = new LinkedList<>(); list.add("Java"); list.add("Python"); list.add("C++");
((LinkedList<String>) list).addFirst("Go"); ((LinkedList<String>) list).addLast("Rust");
System.out.println(list);
((LinkedList<String>) list).removeFirst(); ((LinkedList<String>) list).removeLast(); System.out.println(list); } }
|
✅ 6. Vector 和 Stack
6.1 Vector(线程安全的 ArrayList)
Vector 和 ArrayList 类似,但它的方法是 线程安全 的(使用 synchronized 进行同步)。
1 2 3 4 5 6 7 8 9 10 11 12
| import java.util.Vector;
public class VectorExample { public static void main(String[] args) { Vector<String> vector = new Vector<>(); vector.add("Java"); vector.add("Python"); vector.add("C++");
System.out.println(vector); } }
|
6.2 Stack(栈,先进后出)
Stack 继承 Vector,是一个**后进先出(LIFO)**的集合,常用方法:
push(E e):压栈
pop():弹栈
peek():查看栈顶元素
1 2 3 4 5 6 7 8 9 10 11 12 13
| import java.util.Stack;
public class StackExample { public static void main(String[] args) { Stack<String> stack = new Stack<>(); stack.push("Java"); stack.push("Python"); stack.push("C++");
System.out.println(stack.pop()); System.out.println(stack.peek()); } }
|
✅ 7. 总结
ArrayList:查询快,增删慢,适用于读多写少的场景。
LinkedList:增删快,查询慢,适用于频繁插入删除的场景。
Vector:线程安全,但性能较低。
Stack:后进先出(LIFO)。