Java List 集合详解:从基础到实战,掌握 Java 列表操作全貌

作为一名 Java 开发工程师 ,你一定在项目中频繁使用过 List 集合。它是 Java 集合框架中最常用、最灵活的数据结构之一。无论是从数据库查询出的数据,还是前端传递的参数列表,List 都是处理这些数据的首选结构。

本文将带你全面掌握:

  • List 接口的核心方法与特性
  • 常见实现类(如 ArrayListLinkedListVectorCopyOnWriteArrayList
  • List 的遍历、增删改查、排序、线程安全等操作
  • List 在实际业务中的应用场景
  • List 与数组、集合工具类(如 Arrays.asList()Collections)的结合使用
  • 最佳实践与常见误区

并通过丰富的代码示例和真实项目场景讲解,帮助你写出更高效、结构更清晰的 Java 列表代码。


🧱 一、什么是 List 集合?

List 是 Java 集合框架中 Collection 接口的子接口,表示一个有序、可重复、可通过索引访问的元素集合。

List 的核心特性:

特性 描述
有序 元素按照插入顺序存储
可重复 允许添加重复元素
可索引访问 支持通过 get(index) 获取元素
可动态扩容 ArrayList 会自动扩容
支持泛型 推荐使用泛型来保证类型安全

🔍 二、List 的常见实现类

实现类 特点 适用场景
ArrayList 基于数组实现,查询快,增删慢 默认列表实现,适合频繁读取
LinkedList 基于链表实现,增删快,查询慢 插入删除频繁、队列操作
Vector 线程安全,性能较低 旧版本遗留类,建议使用 Collections.synchronizedList()
CopyOnWriteArrayList 线程安全,写时复制,读操作不加锁 多读少写的并发场景

🧠 三、List 的基本操作

✅ 1. 创建与初始化

ini 复制代码
// 使用 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. 添加元素

csharp 复制代码
list.add("Java");            // 添加到末尾
list.add(0, "Go");           // 插入到指定索引
list.addAll(Arrays.asList("Python", "JavaScript")); // 添加集合

✅ 3. 删除元素

csharp 复制代码
list.remove("Java");         // 按值删除
list.remove(0);              // 按索引删除
list.clear();                // 清空列表

✅ 4. 修改元素

c 复制代码
list.set(0, "Kotlin");       // 替换指定索引的元素

✅ 5. 查询元素

ini 复制代码
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. 排序

scss 复制代码
// 默认排序(升序)
list.sort(null);

// 自定义排序(降序)
list.sort(Collections.reverseOrder());

// 使用 Lambda 表达式排序
list.sort((a, b) -> b.compareTo(a));

✅ 2. 反转与洗牌

scss 复制代码
Collections.reverse(list); // 反转列表
Collections.shuffle(list); // 打乱顺序(随机排列)

✅ 3. 子列表与替换

arduino 复制代码
List<String> subList = list.subList(0, 3); // 获取子列表 [0, 3)
Collections.replaceAll(list, "Java", "JVM"); // 替换所有匹配元素

✅ 4. 转换为数组

ini 复制代码
String[] array = list.toArray(new String[0]);

✅ 5. 合并与去重

ini 复制代码
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

ini 复制代码
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)

less 复制代码
@PostMapping("/save")
public void saveUsers(@RequestBody List<User> users) {
    userService.saveAll(users);
}

场景3:使用 List 实现简单的缓存

vbnet 复制代码
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

ini 复制代码
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>
常用实现类 ArrayListLinkedListCopyOnWriteArrayList
核心方法 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核心技术深度解析!

相关推荐
SoFlu软件机器人6 分钟前
告别手动报表开发!描述数据维度,AI 自动生成 SQL 查询 + Java 导出接口
java·数据库·sql
达文汐9 分钟前
【中等】题解力扣22:括号生成
java·算法·leetcode·深度优先
JuiceFS12 分钟前
合合信息:基于 JuiceFS 构建统一存储,支撑 PB 级 AI 训练
运维·后端
调试人生的显微镜18 分钟前
iOS 文件深度调试实战 查看用户文件 App 沙盒 系统文件与日志全指南
后端
aiopencode20 分钟前
没有 Mac,如何上架 iOS App?跨平台团队的全流程实践指南
后端
天天摸鱼的java工程师22 分钟前
如何防止重复提交订单?
java·后端·面试
星星电灯猴25 分钟前
Charles 抓不到包怎么办?详解原因与多维解决方案
后端
慕尘_28 分钟前
对于未来技术的猜想:Manus as a Service
前端·后端
秋水丶秋水35 分钟前
Python常见异常和处理方案
后端·python
程序无bug36 分钟前
pring Boot监控方案
java·后端