作为一名 Java 开发工程师 ,你一定在项目中频繁使用过 List 集合。它是 Java 集合框架中最常用、最灵活的数据结构之一。无论是从数据库查询出的数据,还是前端传递的参数列表,List 都是处理这些数据的首选结构。
本文将带你全面掌握:
- List接口的核心方法与特性
- 常见实现类(如 ArrayList、LinkedList、Vector、CopyOnWriteArrayList)
- List的遍历、增删改查、排序、线程安全等操作
- List在实际业务中的应用场景
- List与数组、集合工具类(如- Arrays.asList()、- Collections)的结合使用
- 最佳实践与常见误区
并通过丰富的代码示例和真实项目场景讲解,帮助你写出更高效、结构更清晰的 Java 列表代码。
🧱 一、什么是 List 集合?
List 是 Java 集合框架中 Collection 接口的子接口,表示一个有序、可重复、可通过索引访问的元素集合。
✅ List 的核心特性:
| 特性 | 描述 | 
|---|---|
| 有序 | 元素按照插入顺序存储 | 
| 可重复 | 允许添加重复元素 | 
| 可索引访问 | 支持通过 get(index)获取元素 | 
| 可动态扩容 | 如 ArrayList会自动扩容 | 
| 支持泛型 | 推荐使用泛型来保证类型安全 | 
🔍 二、List 的常见实现类
| 实现类 | 特点 | 适用场景 | 
|---|---|---|
| ArrayList | 基于数组实现,查询快,增删慢 | 默认列表实现,适合频繁读取 | 
| LinkedList | 基于链表实现,增删快,查询慢 | 插入删除频繁、队列操作 | 
| Vector | 线程安全,性能较低 | 旧版本遗留类,建议使用 Collections.synchronizedList() | 
| CopyOnWriteArrayList | 线程安全,写时复制,读操作不加锁 | 多读少写的并发场景 | 
🧠 三、List 的基本操作
✅ 1. 创建与初始化
// 使用 ArrayList 初始化
List<String> list = new ArrayList<>();
// 静态初始化
List<String> list2 = Arrays.asList("Java", "Python", "C++");
// 不可变列表(Java 9+)
List<String> list3 = List.of("A", "B", "C");✅ 2. 添加元素
list.add("Java");            // 添加到末尾
list.add(0, "Go");           // 插入到指定索引
list.addAll(Arrays.asList("Python", "JavaScript")); // 添加集合✅ 3. 删除元素
list.remove("Java");         // 按值删除
list.remove(0);              // 按索引删除
list.clear();                // 清空列表✅ 4. 修改元素
list.set(0, "Kotlin");       // 替换指定索引的元素✅ 5. 查询元素
String first = list.get(0);  // 获取指定索引元素
boolean contains = list.contains("Java"); // 是否包含某个元素
int index = list.indexOf("Java");         // 查找元素索引✅ 6. 遍历方式对比
| 遍历方式 | 示例 | 特点 | 
|---|---|---|
| 普通 for 循环 | for (int i = 0; i < list.size(); i++) | 支持索引操作 | 
| 增强 for 循环 | for (String s : list) | 简洁易读 | 
| Iterator 迭代器 | Iterator<String> it = list.iterator(); while (it.hasNext()) | 支持在遍历中删除 | 
| Stream 流式处理 | list.stream().forEach(System.out::println) | 支持过滤、映射、排序等操作 | 
🔁 四、List 的高级操作
✅ 1. 排序
// 默认排序(升序)
list.sort(null);
// 自定义排序(降序)
list.sort(Collections.reverseOrder());
// 使用 Lambda 表达式排序
list.sort((a, b) -> b.compareTo(a));✅ 2. 反转与洗牌
Collections.reverse(list); // 反转列表
Collections.shuffle(list); // 打乱顺序(随机排列)✅ 3. 子列表与替换
List<String> subList = list.subList(0, 3); // 获取子列表 [0, 3)
Collections.replaceAll(list, "Java", "JVM"); // 替换所有匹配元素✅ 4. 转换为数组
String[] array = list.toArray(new String[0]);✅ 5. 合并与去重
List<String> combined = new ArrayList<>();
combined.addAll(list1);
combined.addAll(list2);
Set<String> unique = new LinkedHashSet<>(combined);
List<String> deduplicated = new ArrayList<>(unique);🧪 五、List 的实际应用场景
场景1:从数据库查询结果封装为 List
        List<User> users = new ArrayList<>();
try (ResultSet rs = statement.executeQuery("SELECT * FROM users")) {
    while (rs.next()) {
        User user = new User(rs.getString("name"), rs.getInt("age"));
        users.add(user);
    }
}场景2:前端参数接收(Spring Boot)
@PostMapping("/save")
public void saveUsers(@RequestBody List<User> users) {
    userService.saveAll(users);
}场景3:使用 List 实现简单的缓存
        List<CacheItem> cache = new ArrayList<>();
public void put(String key, String value) {
    cache.add(new CacheItem(key, value));
}
public String get(String key) {
    return cache.stream()
        .filter(item -> item.getKey().equals(key))
        .map(CacheItem::getValue)
        .findFirst()
        .orElse(null);
}场景4:多线程安全的 List
        List<String> list = Collections.synchronizedList(new ArrayList<>());
// 或者
List<String> list = new CopyOnWriteArrayList<>();🚫 六、常见误区与注意事项
| 误区 | 正确做法 | 
|---|---|
| 在遍历中直接删除元素 | 使用 Iterator.remove() | 
| 使用 ==比较字符串元素 | 使用 equals()或Objects.equals() | 
| 忘记初始化 List就使用 | 先 new ArrayList<>() | 
| 忘记处理 null元素 | List允许添加null,但某些操作会抛出异常 | 
| 忽略线程安全问题 | 多线程建议使用 CopyOnWriteArrayList或同步包装 | 
| 错误使用 List.of()修改列表 | List.of(...)是不可变列表,修改会抛出异常 | 
📊 七、List 核心知识点一览表
| 内容 | 说明 | 
|---|---|
| 接口定义 | List<E> | 
| 常用实现类 | ArrayList、LinkedList、CopyOnWriteArrayList | 
| 核心方法 | add、remove、set、get、size、contains、indexOf | 
| 遍历方式 | 普通 for、增强 for、Iterator、Stream | 
| 常用操作 | 排序、反转、子列表、合并、去重 | 
| 线程安全 | Collections.synchronizedList()、CopyOnWriteArrayList | 
| 应用场景 | 数据库结果集、前端参数接收、缓存、任务队列 | 
📎 八、附录:List 常用技巧速查表
| 技巧 | 示例 | 
|---|---|
| 创建只读列表 | Collections.unmodifiableList(list) | 
| 同步列表 | Collections.synchronizedList(new ArrayList<>()) | 
| 列表转数组 | list.toArray(new String[0]) | 
| 判断是否为空 | list.isEmpty() | 
| 获取最大最小值 | Collections.max(list)/Collections.min(list) | 
| 列表反转 | Collections.reverse(list) | 
| 列表洗牌 | Collections.shuffle(list) | 
| 替换所有元素 | Collections.replaceAll(list, "old", "new") | 
| 使用 Stream 过滤 | list.stream().filter(s -> s.startsWith("A")).toList() | 
| 使用 Stream 转换 | list.stream().map(String::toUpperCase).toList() | 
如果你正在准备一篇面向初学者的技术博客,或者希望系统回顾 Java 基础知识,这篇文章将为你提供完整的知识体系和实用的编程技巧。
欢迎点赞、收藏、转发,也欢迎留言交流你在实际项目中遇到的 List 集合相关问题。我们下期再见 👋
📌 关注我,获取更多Java核心技术深度解析!