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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/89212.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/89212.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/89212.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SGMD辛几何模态分解 直接替换Excel运行包含频谱图相关系数图 Matlab语言!

SGMD辛几何模态分解 直接替换Excel运行包含频谱图相关系数图 Matlab语言算法近几年刚提出&#xff0c;知网还没几个人用&#xff0c;你先用&#xff0c;你就是创新&#xff01;算法新颖小众&#xff0c;用的人很少&#xff0c;包含分解图、频谱图、相关系数图&#xff0c;效果如…

Oracle数据泵详解——让数据迁移像“点外卖”一样简单​

​今天我想和大家聊一个数据库领域的“万能搬运工”——Oracle数据泵&#xff08;Data Pump&#xff09;​。相信很多人都有过这样的经历&#xff1a;业务要上线新系统&#xff0c;得把旧库的数据搬到新环境&#xff1b;或者领导突然要一份3年前的历史数据&#xff0c;可不能影…

Leetcode 03 java

爬楼梯算法现在只看明白动态规划&#xff0c;也没有很难哟&#xff01;&#xff01;题目70. 爬楼梯假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f;java题解class Solution {public int climbStairs(…

怎么删除 wps 的右键菜单

打开 WPS 点击 WPS Office 选项卡&#xff0c;点击右侧全局配置》配置和修复工具点击高级功能定制下的都可以关闭和隐藏点击确定就可以了。

C++:list

一&#xff0c;list的介绍1&#xff0c;list初步&#xff08;1&#xff09;list是 C 标准模板库 (STL) 中的一个双向链表容器。它允许在常数时间内进行任意位置的插入和删除操作&#xff0c;但不支持随机访问。&#xff08;2&#xff09;list容器的底层数据结构为带头双向循环链…

深入理解Collections.addAll方法

文章目录深入理解Collections.addAll方法概述方法定义基本用法1. 向List添加元素2. 向Set添加元素3. 添加数组元素与传统add方法的比较使用传统add方法使用Collections.addAll性能考虑注意事项实际应用场景与Collection.addAll的区别最佳实践总结深入理解Collections.addAll方法…

CISP-PTE 练习题(完整一套)

目录 1、SQL注入 2、文件上传 3、文件包含 4、代码审计 5、命令执行 6、端口扫描 7、sql 写 webshell 8、3389 远程桌面利用 1、SQL注入 sqllabs-less-24 二次注入 2、文件上传 没有对文件后缀进行检测&#xff0c;但是对文件类型有检测&#xff0c;需要使用图片头绕…

Vue3入门-计算属性+监听器

&#x1f3e0;个人主页&#xff1a;Yui_ &#x1f351;操作环境&#xff1a;vscode\node.js &#x1f680;所属专栏&#xff1a;Vue3 文章目录1. 计算属性1.1 computed函数1.2 计算属性VS普通函数1.3 计算属性的完整写法2. 监听器3.总结1. 计算属性 计算属性&#xff08;compu…

Linux Swap区深度解析:为何禁用?何时需要?

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录前言一、Swap区&#xff1a;Linux的"内存救生圈"二、为什么要禁用Swap&#xff1f;性能的隐形杀手三、何时应该使用Swap&#xff1f;不可或缺的场景四、如…

用TensorFlow进行逻辑回归(三)

逻辑回归Logistic regression这个脚本展示如何用TensorFlow求解逻辑回归。 ()ysigmoid(Axb)我们使用低出生重量数据,特别地:y 0 or 1 low birth weightx demographic and medical history dataimport matplotlib.pyplot as pltimport numpy as npimport tensorflow as tfimp…

mingw 编译 assimp v6.0.2 解决编译报错

mingw 编译 assimp v6.0.2 理论上看这个就能满足&#xff1a;在Windows下使用CMakeMinGW64编译Assimp库 环境变量问题 i386 architecture of input file CMakeFiles\assimp.dir/objects.a(assimp.rc.obj)’ is incompatible with i386:x86-64 output collect2.exe: error: ld r…

Windows 11清理C盘方法大全:磁盘清理/禁用休眠/系统还原点/优化大师使用教程

Windows 11清理C盘方法1. 使用磁盘清理工具步骤&#xff1a;按 Win S 搜索“磁盘清理”&#xff0c;打开工具。选择C盘&#xff0c;点击“确定”。勾选需要清理的文件类型&#xff08;如临时文件、系统错误内存转储等&#xff09;&#xff0c;点击“确定”。确认删除操作&…

Rabbitmq Direct Exchange(直连交换机)多个消费者,配置相同的key ,队列,可以保证只有一个消费者消费吗

思考可以保证消费不被重复消费&#xff0c;因为通过轮询一个消息只会投递给一个消费者。但是不是一个消费者消费&#xff0c;而是多个轮询消费在 RabbitMQ 中&#xff0c;如果多个消费者&#xff08;Consumers&#xff09;同时订阅 同一个队列&#xff08;Queue&#xff09;&am…

设计模式是什么呢?

1.掌握设计模式的层次第一层&#xff1a;刚刚学编程不久&#xff0c;听说过什么是设计模式。第二层&#xff1a;有很长时间的编程经验&#xff0c;自己写过很多代码&#xff0c;其中用到了设计模式&#xff0c;但是自己不知道。第三层&#xff1a;学习过设计模式&#xff0c;发…

ThreadLocal使用详解-从源码层面分析

从demo入手看效果 代码Demostatic ThreadLocal tl1 new ThreadLocal();static ThreadLocal tl2 new ThreadLocal();static ThreadLocal tl3 new ThreadLocal();public static void main(String[] args) {tl1.set("123");tl2.set("456");tl3.set("4…

CPO:对比偏好优化—突破大型语言模型在机器翻译中的性能边界

温馨提示&#xff1a; 本篇文章已同步至"AI专题精讲" CPO&#xff1a;对比偏好优化—突破大型语言模型在机器翻译中的性能边界 摘要 中等规模的大型语言模型&#xff08;LLMs&#xff09;&#xff0c;如参数量为 7B 或 13B 的模型&#xff0c;在机器翻译&#xff0…

执行shell 脚本 如何将日志全部输出到文件

在执行 Shell 脚本时&#xff0c;如果需要将 所有输出&#xff08;包括标准输出 stdout 和错误输出 stderr&#xff09; 重定向到日志文件&#xff0c;可以使用以下方法&#xff1a;方法 1&#xff1a;直接重定向&#xff08;推荐&#xff09; /appdata/mysql_backup_dump.sh &…

Postman接口测试实现UI自动化测试

Selenium底层原理 3天精通Postman接口测试&#xff0c;全套项目实战教程&#xff01;&#xff01;运行代码&#xff0c;启动浏览器后&#xff0c;webdriver会将浏览器绑定到特定的端口&#xff0c;作为webdriver的remote server&#xff08;远程服务端&#xff09;&#xff0c;…

CSS动画与变换全解析:从原理到性能优化的深度指南

引言&#xff1a;现代Web动画的技术革命 在当今的Web体验中&#xff0c;流畅的动画效果已成为用户交互的核心要素。根据Google的研究&#xff0c;60fps的动画可以使用户参与度提升53%&#xff0c;而卡顿的界面会导致跳出率增加40%。本文将深入剖析CSS动画&#xff08;animation…

NPM组件 @ivy-shared-components/iconslibrary 等窃取主机敏感信息

【高危】NPM组件 ivy-shared-components/iconslibrary 等窃取主机敏感信息 漏洞描述 当用户安装受影响版本的 ivy-shared-components/iconslibrary 等NPM组件包时会窃取用户的主机名、用户名、工作目录、IP地址等信息并发送到攻击者可控的服务器地址。 MPS编号MPS-zh19-e78w…