0

0

在Java中如何根据业务选择List实现_Java集合选型思路解析

P粉602998670

P粉602998670

发布时间:2026-02-13 12:35:05

|

581人浏览过

|

来源于php中文网

原创

arraylist适合随机读取多、增删少的场景,底层为动态数组,get()和尾部add()均摊o(1),但中间增删为o(n);linkedlist仅在频繁头尾增删且几乎不随机访问时适用,get()为o(n)。

在java中如何根据业务选择list实现_java集合选型思路解析

ArrayList 适合随机读取多、增删少的场景

当业务中频繁调用 get(int index) 或遍历访问元素,且插入/删除集中在尾部(如日志缓冲、批量结果暂存),ArrayList 是首选。它底层是动态数组,get() 时间复杂度为 O(1),尾部 add() 均摊也是 O(1)。

但要注意:在中间位置 add(int index, E element)remove(int index) 会触发数组复制,最坏 O(n)。如果业务日志写入后还要按时间戳插入到中间位置排序,就别硬扛——改用 LinkedList 或先收集再排序。

常见误用:
- 把 ArrayList 当队列用,反复 remove(0) 模拟出队 → 实际是 O(n) 操作,应换 ArrayDeque
- 初始化容量过小(默认 10),导致高频扩容(Arrays.copyOf())和内存抖动 → 提前预估 size,用 new ArrayList(expectedSize)

LinkedList 不等于“通用链表优化版”

LinkedList 只在**频繁头尾增删 + 几乎不随机访问**时才有意义。它的 addFirst()removeLast() 等操作是 O(1),但 get(int index) 是 O(n) 遍历——这点常被忽略。

真实业务中容易踩坑的点:
- 用 for (int i = 0; i 遍历 <code>LinkedList → 每次 get() 都从头/尾开始找,整体变成 O(n²)
- 以为它线程安全或内存更省 → 实际每个元素额外持两个引用(prev/next),比 ArrayList 更占内存
- 试图用它替代栈或队列 → 直接用 ArrayDeque(基于数组、无同步开销、性能更好)更合适

典型适用场景:实现 LRU 缓存的双向链表结构(配合 HashMap 维护节点引用),而非直接拿 LinkedList 存业务数据。

立即学习Java免费学习笔记(深入)”;

聪豹Wiseal
聪豹Wiseal

聪豹Wiseal是一个专业的历史时间线收集整理工具

下载

并发场景下别直接用 ArrayList 或 LinkedList

Java 的 ArrayListLinkedList 都不是线程安全的。在多线程写入(如定时任务+用户请求同时往同一列表 add)时,可能抛 ConcurrentModificationException,或出现数据丢失、越界等未定义行为。

根据并发强度和一致性要求选:
- 读多写少,允许弱一致性(如统计缓存)→ Collections.synchronizedList(new ArrayList()),但注意迭代仍需手动同步
- 写操作频繁且需强一致性 → CopyOnWriteArrayList,适合监听器列表等“读远大于写”的场景;但每次写都复制整个数组,大数据量写入代价极高
- 高吞吐、低延迟、可接受最终一致 → ConcurrentLinkedQueue(非 List 接口,但常被拿来替代)或分段加锁结构(如自定义 StripedList

切记:synchronizedList 包裹的 ArrayList 并不能让 list.get(i) == list.get(i+1) 这类复合操作原子化,业务逻辑仍需外层锁或重设计。

业务语义比性能参数更重要

选型时最容易被忽略的是接口契约本身。比如:
- 需要保持插入顺序且去重 → LinkedHashSet 比 “手动检查 ArrayList.contains() 再 add” 更可靠、更清晰
- 要按自然顺序或自定义顺序遍历时保证有序 → TreeSetPriorityQueue(注意后者不是 List)比每次插入后调用 Collections.sort() 更合理
- 接口方法明确要求支持快速随机访问(如某些 SDK 的 callback 参数类型限定为 List)→ 即便内部只读,也得传 ArrayList,不能塞 LinkedList(否则性能雪崩)

一个具体例子:报表导出接口接收 List<reportrow></reportrow>,内部要做分页(subList(from, to))。若传入 LinkedListsubList() 返回的仍是链表子视图,后续 get() 仍慢;而 ArrayList.subList() 返回的是支持 O(1) 访问的 RandomAccessSubList

所以别只盯着 big-O,先看业务调用模式、接口约束、维护成本——有时候多 2 行代码封装一层,比强行套用某个实现更可持续。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
sort排序函数用法
sort排序函数用法

sort排序函数的用法:1、对列表进行排序,默认情况下,sort函数按升序排序,因此最终输出的结果是按从小到大的顺序排列的;2、对元组进行排序,默认情况下,sort函数按元素的大小进行排序,因此最终输出的结果是按从小到大的顺序排列的;3、对字典进行排序,由于字典是无序的,因此排序后的结果仍然是原来的字典,使用一个lambda表达式作为key参数的值,用于指定排序的依据。

399

2023.09.04

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

708

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

561

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

193

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

206

2025.08.29

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

1416

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

339

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2209

2025.12.29

pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

1

2026.02.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 3.5万人学习

C# 教程
C# 教程

共94课时 | 9.3万人学习

Java 教程
Java 教程

共578课时 | 64.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号