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. 创建与初始化

// 使用 ArrayList 初始化
List list = new ArrayList<>();

// 静态初始化
List list2 = Arrays.asList("Java", "Python", "C++");

// 不可变列表(Java 9+)
List 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 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 subList = list.subList(0, 3); // 获取子列表 [0, 3)
Collections.replaceAll(list, "Java", "JVM"); // 替换所有匹配元素

✅ 4. 转换为数组

String[] array = list.toArray(new String[0]);

✅ 5. 合并与去重

List combined = new ArrayList<>();
combined.addAll(list1);
combined.addAll(list2);

Set unique = new LinkedHashSet<>(combined);
List deduplicated = new ArrayList<>(unique);

五、List 的实际应用场景

场景1:从数据库查询结果封装为 List

List 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 users) {
    userService.saveAll(users);
}

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

List 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 list = Collections.synchronizedList(new ArrayList<>());
// 或者
List list = new CopyOnWriteArrayList<>();

六、常见误区与注意事项

误区 正确做法
在遍历中直接删除元素 使用 Iterator.remove()
使用 == 比较字符串元素 使用 equals() 或 Objects.equals()
忘记初始化 List 就使用 先 new ArrayList<>()
忘记处理 null 元素 List 允许添加 null,但某些操作会抛出异常
忽略线程安全问题 多线程建议使用 CopyOnWriteArrayList 或同步包装
错误使用 List.of() 修改列表 List.of(...) 是不可变列表,修改会抛出异常

七、List 核心知识点一览表

内容 说明
接口定义 List
常用实现类 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核心技术深度解析!

你可能感兴趣的:(java合集,java,开发语言,后端,学习,个人开发)