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