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)。