作为一名 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核心技术深度解析!