Skip to content

List 核心方法:增删改查全攻略

List 和 Collection 的区别

List 是 Collection 的子接口,比 Collection 多了一套「按位置操作」的能力。简单说:Collection 回答「有没有」,List 回答「在哪」。

java
// Collection 只有这些
collection.add(e);       // 添加
collection.remove(o);    // 删除
collection.contains(o);  // 有没有

// List 多了这些
list.get(0);            // 按位置获取
list.set(0, e);         // 按位置修改
list.add(0, e);         // 按位置插入
list.remove(0);          // 按位置删除
list.indexOf(o);        // 找在哪

添加操作:3 种方式

在末尾添加

java
List<String> list = new ArrayList<>();

list.add("Java");
list.add("Python");
list.add("Go");

System.out.println(list); // [Java, Python, Go]

在指定位置插入

java
list.add(1, "Rust"); // 在索引 1 插入

System.out.println(list); // [Java, Rust, Python, Go]

插入后,后面的元素依次后移。如果插入位置大于 size,会抛 IndexOutOfBoundsException

批量添加

java
List<String> other = Arrays.asList("Ruby", "Swift");

list.addAll(other);        // 追加到末尾
list.addAll(1, other);    // 插入到指定位置

System.out.println(list);

小技巧

addAll() 返回 boolean——如果至少添加了一个元素就返回 true。可以用来判断集合是否为空:

java
boolean hadNewElements = list.addAll(other);

访问操作:获取元素

按索引获取

java
String first = list.get(0);   // 获取第一个
String last = list.get(list.size() - 1); // 获取最后一个

// 越界?抛异常
list.get(100); // IndexOutOfBoundsException

查找元素位置

java
List<String> list = Arrays.asList("A", "B", "C", "B", "A");

list.indexOf("B");      // 1,从前往后找
list.lastIndexOf("B");  // 3,从后往前找
list.indexOf("X");     // -1,不存在返回 -1

修改操作:按位置替换

java
List<String> list = new ArrayList<>(Arrays.asList("A", "B", "C"));

String old = list.set(1, "BB"); // 返回被替换的元素 "B"
System.out.println(list);       // [A, BB, C]

set() 不改变集合大小,只是替换指定位置的元素。


删除操作:3 种方式

按索引删除

java
List<String> list = new ArrayList<>(Arrays.asList("A", "B", "C", "D"));

String removed = list.remove(1); // 删除索引 1,返回 "B"
System.out.println(list);       // [A, C, D]

按对象删除

java
boolean success = list.remove("C"); // 按对象删除,返回是否成功
System.out.println(list);            // [A, B, D]

注意:remove("C") 在 List 中会删除第一个匹配的元素,不是全部匹配。

批量删除

java
// 删除所有匹配的元素
list.removeAll(Arrays.asList("A", "B")); // 删除 A 和 B

// 只保留匹配的元素(取交集)
list.retainAll(Arrays.asList("B", "C")); // 只保留 B 和 C

// 清空
list.clear();
System.out.println(list.size()); // 0

子列表:视图操作

subList() 返回原列表的一个视图,修改子列表会影响原列表:

java
List<String> list = new ArrayList<>(Arrays.asList("A", "B", "C", "D", "E"));

// 获取子列表 [B, C]
List<String> sub = list.subList(1, 3);

// 通过子列表操作原列表
sub.set(0, "BB"); // 原列表:[A, BB, C, D, E]
sub.clear();       // 原列表:[A, D, E]

子列表的坑

子列表是视图,不是副本。对子列表的修改直接影响原列表。可以用 new ArrayList<>(list.subList(...)) 创建独立副本。


批量替换(JDK 8+)

java
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);

// replaceAll:每个元素 * 10
numbers.replaceAll(n -> n * 10);
System.out.println(numbers); // [10, 20, 30, 40, 50]

// sort:排序
numbers.sort(Comparator.reverseOrder());
System.out.println(numbers); // [50, 40, 30, 20, 10]

完整示例

java
import java.util.*;

public class ListMethodsDemo {

    public static void main(String[] args) {
        List<String> list = new ArrayList<>();

        // 增
        list.add("Java");
        list.add(1, "Python"); // 插到位置 1
        list.addAll(Arrays.asList("Go", "Rust"));
        System.out.println("增: " + list);

        // 查
        System.out.println("get(0): " + list.get(0));
        System.out.println("indexOf('Go'): " + list.indexOf("Go"));
        System.out.println("contains('Rust'): " + list.contains("Rust"));

        // 改
        String old = list.set(2, "Golang");
        System.out.println("改 '" + old + "' 为 'Golang': " + list);

        // 删
        list.remove("Rust");       // 按对象
        String removed = list.remove(0); // 按索引
        System.out.println("删 [0]: " + list);

        // 子列表
        List<String> sub = list.subList(0, 2);
        System.out.println("子列表: " + sub);
        sub.replaceAll(s -> s.toUpperCase());
        System.out.println("子列表修改后,原列表: " + list);

        // 批量
        list.replaceAll(s -> "[" + s + "]");
        System.out.println("批量修改: " + list);

        list.clear();
        System.out.println("清空后: " + list);
    }
}

方法一览表

方法说明返回值
add(e)末尾添加boolean
add(index, e)指定位置插入void
addAll(collection)批量添加boolean
get(index)按索引获取E
set(index, e)按索引替换被替换的元素
remove(index)按索引删除被删除的元素
remove(Object)按对象删除boolean
removeAll(collection)批量删除boolean
retainAll(collection)取交集boolean
clear()清空void
indexOf(Object)首次出现位置int
lastIndexOf(Object)最后出现位置int
subList(from, to)子列表视图List
replaceAll(operator)批量替换void
sort(Comparator)排序void

相关链接

基于 VitePress 构建