Java常用集合类库与LinkedList、ArrayList

发布时间 - 2026-01-07 00:00:00    点击率:
ArrayList基于动态数组,支持O(1)随机访问但中间增删为O(n);LinkedList是双向链表,首尾增删O(1)但按索引查找O(n),且内存开销大、缓存不友好,非必要不推荐使用。

ArrayList 和 LinkedList 的底层实现差异直接决定性能表现

ArrayList 是基于动态数组实现的,支持 O(1) 随机访问,但插入/删除中间元素需移动后续元素,平均时间复杂度为 O(n);LinkedList 是双向链表,头尾增删是 O(1),但按索引查找必须遍历,get(i) 是 O(n)。

实际选型不能只看“增删快还是查得快”,要结合具体操作模式:

  • 频繁 get(i) 或遍历 for-each → 优先 ArrayList
  • 大量在列表首/尾调用 addFirst()removeLast()(且没用到 ArrayList 的随机访问)→ LinkedList 可能更合适
  • list.add(index, element) 在中间位置插入?两者都慢,但 ArrayList 还要数组扩容+拷贝,LinkedList 虽免拷贝,但先遍历找节点开销也不小

LinkedList 不是 Stack 或 Queue 的最佳替代品

虽然 LinkedList 实现了 Deque 接口,能当栈或队列用,但它不是最优选择:

  • 作为栈:用 ArrayDeque 更高效 —— 底层循环数组,无节点对象开销,缓存友好
  • 作为队列:ArrayDeque 同样优于 LinkedList,尤其在中等规模数据下吞吐更高
  • Stack 类已被官方标记为 legacy,不推荐使用;Deque 接口方法如 push()pop()offerFirst() 等才是标准做法

简单验证:

Deque stack = new ArrayDeque<>(); // ✅ 推荐
Deque badStack = new LinkedList<>(); // ⚠️ 语义可行,但非最优

ArrayList 的扩容机制和初始容量设置很关键

默认构造函数创建的 ArrayList 初始容量为 0,第一次 add 时才分配 10 个元素空间;后续扩容策略是 oldCapacity + (oldCapacity >> 1)(即 1.5 倍),涉及数组拷贝,有 GC 和 CPU 开销。

如果已知大致元素数量,务必显式指定初始容量:

  • 写死容量:如 new ArrayList(1024)
  • 从已有集合构造:用 new ArrayList(otherCollection),它会按 otherCollection.size() 预分配
  • 避免反复扩容:比如循环中不断 add() 且总量可预估,不设初容量可能触发多次 resize

LinkedList 的内存开销比 ArrayList 高得多

每个 LinkedList 元素都要额外封装成一个 Node 对象,含前后引用(两个指针)和数据字段;而 ArrayList 是紧凑的 Object[] 数组。在 10 万个 String 元素场景下,LinkedList 内存占用通常是 ArrayList 的 2–3 倍以上。

这意味着:

  • GC 压力更大:更多短生命周期对象(Node)被创建和回收
  • CPU 缓存不友好:节点在堆中分散分布,遍历时 cache miss 高
  • 除非你真正在意头尾 O(1) 操作,且数据量不大,否则别为了“听起来更灵活”选 LinkedList

真正需要链式结构的场景,往往该考虑 ConcurrentLinkedQueue 或自定义节点逻辑,而不是拿 LinkedList 当通用列表用。


# java  # node  #   # 内存占用 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 网站制作软件有哪些,制图软件有哪些?  Laravel如何使用Blade组件和插槽?(Component代码示例)  Laravel软删除怎么实现_Laravel Eloquent SoftDeletes功能使用教程  Laravel如何设置自定义的日志文件名_Laravel根据日期或用户ID生成动态日志【技巧】  Laravel Blade组件怎么用_Laravel可复用视图组件的创建与使用  Laravel的契約(Contracts)是什么_深入理解Laravel Contracts与依赖倒置  如何在新浪SAE免费搭建个人博客?  Laravel如何优雅地处理服务层_在Laravel中使用Service层和Repository层  如何在万网利用已有域名快速建站?  JS经典正则表达式笔试题汇总  北京企业网站设计制作公司,北京铁路集团官方网站?  Win10如何卸载预装Edge扩展_Win10卸载Edge扩展教程【方法】  zabbix利用python脚本发送报警邮件的方法  Laravel如何正确地在控制器和模型之间分配逻辑_Laravel代码职责分离与架构建议  如何安全更换建站之星模板并保留数据?  HTML5打空格有哪些误区_新手常犯的空格使用错误【技巧】  如何快速辨别茅台真假?关键步骤解析  Laravel定时任务怎么设置_Laravel Crontab调度器配置  为什么要用作用域操作符_php中访问类常量与静态属性的优势【解答】  高配服务器限时抢购:企业级配置与回收服务一站式优惠方案  Android Socket接口实现即时通讯实例代码  深圳网站制作设计招聘,关于服装设计的流行趋势,哪里的资料比较全面?  如何用PHP快速搭建高效网站?分步指南  Laravel如何优化应用性能?(缓存和优化命令)  javascript读取文本节点方法小结  如何快速搭建虚拟主机网站?新手必看指南  ChatGPT回答中断怎么办 引导AI继续输出完整内容的方法  大连网站制作公司哪家好一点,大连买房网站哪个好?  如何为不同团队 ID 动态生成多个独立按钮  如何用手机制作网站和网页,手机移动端的网站能制作成中英双语的吗?  Laravel怎么使用Blade模板引擎_Laravel模板继承与Component组件复用【手册】  Laravel如何安装使用Debugbar工具栏_Laravel性能调试与SQL监控插件【步骤】  微信小程序 scroll-view组件实现列表页实例代码  Laravel如何配置任务调度?(Cron Job示例)  浅谈javascript alert和confirm的美化  标题:Vue + Vuex + JWT 身份认证的正确实践与常见误区解析  Python正则表达式进阶教程_复杂匹配与分组替换解析  Bootstrap整体框架之JavaScript插件架构  网站建设保证美观性,需要考虑的几点问题!  浅谈redis在项目中的应用  进行网站优化必须要坚持的四大原则  Laravel观察者模式如何使用_Laravel Model Observer配置  JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)  Laravel Eloquent:优雅地将关联模型字段扁平化到主模型中  Internet Explorer官网直接进入 IE浏览器在线体验版网址  如何获取上海专业网站定制建站电话?  如何在VPS电脑上快速搭建网站?  Laravel事件监听器怎么写_Laravel Event和Listener使用教程  javascript中的try catch异常捕获机制用法分析  千问怎样用提示词获取健康建议_千问健康类提示词注意事项【指南】