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 |
