ArrayList vs LinkedList,HashMap vs TreeMap:如何选择最适合的集合类?

精心整理了最新的面试资料和简历模板,有需要的可以自行获取

点击前往百度网盘获取
点击前往夸克网盘获取


在 Java 开发中,集合类的选择直接影响程序的性能和代码的可维护性。不同的数据结构适用于不同的场景,盲目使用可能导致内存浪费、性能下降甚至逻辑错误。本文将从底层原理、时间复杂度、内存占用和典型场景出发,对比分析 ArrayList vs LinkedListHashMap vs TreeMap,帮助你做出合理选择。


一、ArrayList vs LinkedList:线性结构的对决
1. 底层数据结构
  • ArrayList:基于动态数组实现,内存连续分配。
  • LinkedList:基于双向链表实现,节点通过指针连接。
2. 时间复杂度对比
操作ArrayListLinkedList
随机访问(get)O(1)O(n)
头部插入/删除O(n)(需移动元素)O(1)
尾部插入/删除O(1)(均摊时间)O(1)
中间插入/删除O(n)O(n)(需遍历到位置)
3. 内存占用
  • ArrayList:内存紧凑,仅存储数据和容量字段。但可能存在预分配空间(默认扩容为原容量的 1.5 倍)。
  • LinkedList:每个节点需额外存储前驱和后继指针,内存占用约为 ArrayList 的 2 倍。
4. 适用场景
  • 选择 ArrayList
    • 需要频繁随机访问元素(如按索引查询)。
    • 尾部插入/删除操作较多(如栈或队列场景)。
    • 内存敏感,需减少空间碎片。
  • 选择 LinkedList
    • 频繁在头部或中间插入/删除(如实现队列或双向队列)。
    • 无需随机访问,仅需顺序遍历(如迭代器遍历)。
5. 误区与注意事项
  • “LinkedList 插入一定比 ArrayList 快”:实际在中间插入时,LinkedList 需要遍历到目标位置,耗时可能超过 ArrayList 的元素移动。
  • 内存局部性:ArrayList 的连续内存对 CPU 缓存更友好,遍历速度更快。

二、HashMap vs TreeMap:键值对的两种哲学
1. 底层数据结构
  • HashMap:基于哈希表(数组 + 链表/红黑树,Java 8 优化)。
  • TreeMap:基于红黑树(平衡二叉搜索树)。
2. 时间复杂度对比
操作HashMap(平均)TreeMap
插入(put)O(1)O(log n)
查询(get)O(1)O(log n)
范围查询(如子图)不支持O(log n + k)
3. 核心特性
  • HashMap
    • 无序存储,键的哈希值决定位置。
    • 允许 null 键和 null 值。
    • 负载因子(默认 0.75)控制扩容阈值。
  • TreeMap
    • 按键的自然顺序或自定义 Comparator 排序。
    • 支持范围查询(如 subMap()tailMap())。
    • 键不可为 null(依赖比较逻辑)。
4. 适用场景
  • 选择 HashMap
    • 需要快速存取键值对,且不关心顺序。
    • 数据量大且哈希冲突较少(合理设计哈希函数)。
    • 允许 null 键值。
  • 选择 TreeMap
    • 需要按顺序遍历键(如按字母序输出)。
    • 频繁执行范围查询(如查找 10~20 之间的键)。
    • 需自定义排序规则(如按对象属性排序)。
5. 误区与注意事项
  • 哈希冲突:HashMap 在哈希冲突严重时,链表会转为红黑树(Java 8+),但仍需设计良好的哈希函数。
  • 线程安全:二者均非线程安全,多线程场景需用 ConcurrentHashMapCollections.synchronizedMap

三、综合选择策略
  1. 根据操作类型选择

    • 频繁随机访问 → ArrayList
    • 频繁插入删除 → 根据位置选择 LinkedListArrayList
    • 需要排序 → TreeMap
    • 纯键值存取 → HashMap
  2. 根据数据规模选择

    • 小数据量:结构差异对性能影响较小,优先考虑代码可读性。
    • 大数据量:关注时间复杂度,避免线性操作(如 LinkedList 的遍历)。
  3. 通过性能测试验证:理论分析需结合实际场景测试(如 JMH 基准测试)。


四、总结
  • ArrayList:随机访问之王,尾部操作高效,内存友好。
  • LinkedList:头尾插入删除利器,但慎用于遍历和中间操作。
  • HashMap:快速键值存取,无序场景首选。
  • TreeMap:有序键值对的终极选择,支持复杂查询。

最终,选择集合类时需明确需求:是更关注速度、内存,还是功能特性?理解底层原理,结合实际场景,才能写出高效健壮的代码。

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

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

相关文章

大模型训练显存压缩实战:ZeRO-3 vs 梯度累积 vs 量化混合策略

一、显存瓶颈的本质与挑战 大模型训练面临的核心矛盾是模型参数量指数级增长与GPU显存容量线性提升之间的鸿沟。以175B参数模型为例,其显存消耗主要来自三个方面: 参数存储‌:FP32精度下需700GB显存‌梯度缓存‌:反向传播产生的…

边缘计算与隐私计算的融合:构建数据经济的“隐形护盾“

在数据成为核心生产要素的今天,边缘计算与隐私计算的交汇正在重塑技术生态。这并非简单的技术叠加,而是一场关于数据主权、算力分配与信任机制的深度博弈。本文将从"数据流动的拓扑学"视角,探讨二者融合如何重构数字社会的基础设施…

Obsidian 文件夹体系构建 -INKA

Obsidian 文件夹体系构建 -INKA 本篇文章主要分享一下自己折腾学习实践过的 INKA 框架方法。原地址:Obsidian文件夹体系构建–INKA。 文章目录 Obsidian 文件夹体系构建 -INKA前言INKA简介INKA 理论最佳实践实际应用 反思 前言 上文 Obsidian文件夹体系构建-ACCES…

ocr-不动产权识别

目录 一、在阿里云申请ocr识别服务 二、创建springboot项目 三、后续 一、在阿里云申请ocr识别服务 在线体验:房产证图片上传 [阿里官方]不动产权证OCR文字识别_API专区_云市场-阿里云 (aliyun.com) 可以选择一毛500次这个 当然也可以白嫖100 下面有个在线调试…

LeetCode算法题(Go语言实现)_47

题目 给你一个 m x n 的迷宫矩阵 maze (下标从 0 开始),矩阵中有空格子(用 ‘.’ 表示)和墙(用 ‘’ 表示)。同时给你迷宫的入口 entrance ,用 entrance [entrancerow, entrancecol…

The Strict Teacher (Hard Version) 去除无效的干扰!巧妙转化

文章目录 The Strict Teacher (Hard Version) 思考问题!那么多个人抓一个人,是否是每一个人都是对于最优策略的答案是有贡献的?答案是否定的,其实问题可以简化为三种情况: 所有的老师都在大卫的右边,…

《 Reinforcement Learning for Education: Opportunities and Challenges》全文阅读

Reinforcement Learning for Education: Opportunities and Challenges 面向教育的强化学习:机遇与挑战 摘要 本综述文章源自作者在 Educational Data Mining (EDM) 2021 会议期间组织的 RL4ED 研讨会。我们组织了这一研讨会,作为一项社区建设工作的组…

idea的快捷键使用以及相关设置

文章目录 快捷键常用设置 快捷键 快捷键作用ctrlshift/注释选中内容Ctrl /注释一行/** Enter文档注释ALT SHIFT ↑, ALT SHIFT ↓上下移动当前代码Ctrl ALT L格式化代码Ctrl X删除所在行并复制该行Ctrl D复制当前行数据到下一行main/psvm快速生成入口程序soutSystem.o…

代码随想录算法训练营Day30

力扣452.用最少数量的箭引爆气球【medium】 力扣435.无重叠区间【medium】 力扣763.划分字母区间【medium】 力扣56.合并区间【medium】 一、力扣452.用最少数量的箭引爆气球【medium】 题目链接:力扣452.用最少数量的箭引爆气球 视频链接:代码随想录 题…

Swift —— delegate 设计模式

一、什么是 delegate 模式 所谓 delegate 就是代理模式。简单来说,delegate 模式就是在类的函数里运行完一段代码后,你可以通过一个符合某个代理协议的属性来调代理的方法。其中,代理方法就是回调函数。 二、delegate 模式与闭包比的优势 …

linux-vi和文件操作

在 Linux 系统的世界里,有一个核心思想贯穿始终,那就是 “万物都是文件”。这一理念极大地简化了系统资源的管理和操作,为用户和开发者提供了统一且高效的交互方式。本文将深入探讨这一理念在 Linux 文件系统中的具体体现,从硬盘分…

Endnote 21显示字段设置与修改详细解析(附Endnote Click)

目录 前言字段设置与详细解释Endnote Click1. 安装 Endnote Click2. 一键获取Edge插件3. 安装完成启动插件4. 检索期刊文献案例5. 在 Endnote Click 我的locker中导入文献 前言 在学术研究的漫漫征途中,高效管理参考文献是每位学者、学生都绕不开的关键环节。Endno…

java使用 ​Stream 流对自定义对象数组去重的

在 Java 中,使用 Stream 流对自定义对象数组去重的核心是确保对象能正确判断“重复”的逻辑。以下是具体实现方法及场景分析: 方法 1:直接使用 distinct()(需重写 equals 和 hashCode) 若自定义对象已正确重写 equals…

C++ (类的设计,对象的创建,this指针,构造函数)

类的设计 C对结构体是有增强的 可以包含函数作为结构体成员 可以直接定义变量 在结构体成员函数里面可以直接访问结构体成员变量 struct student{string name;int age;float score;void play_game(const string &name);}void student::play_game(const string game){}…

《ADVANCING MATHEMATICAL REASONING IN LAN- GUAGE MODELS》全文阅读

《ADVANCING MATHEMATICAL REASONING IN LAN- GUAGE MODELS: THE IMPACT OF PROBLEM-SOLVING DATA, DATA SYNTHESIS METHODS, AND TRAINING STAGES》全文阅读 提升语言模型中的数学推理能力:问题求解数据、数据合成方法及训练阶段的影响 \begin{abstract} 数学推…

网络测试工具:涵盖网络测速、密码查看、故障判断与网络监测

在网络管理与维护的广阔领域中,网络测试工具扮演着至关重要的角色。它们不仅简化了复杂的网络诊断流程,还提升了工作效率。今天推荐一款包含功能全面的网络测试工具:InetTest,是一款免费且开源的网络测试工具,适用于Wi…

小刚说C语言刷题——1005 - 已知一个圆的半径,求解该圆的面积和周长

1.题目描述 已知一个圆的半径,求解该圆的面积和周长。 输入 输入只有一行,只有 1个整数。 输出 输出只有两行,一行面积,一行周长。(保留两位小数)。 令 pi3.1415926。 样例 输入 1 输出 3.14 6.…

【算法】快速排序

算法系列六:快速排序 一、快速排序的递归探寻 1.思路 2.书写 3.搭建 3.1设计过掉不符情况(在最底层时) 3.2查验能实现基础结果(在最底层往上点时) 3.3跳转结果继续往上回搭 4.实质 二、快速排序里的基准排序 …

SoapUI 4.6.4(32位)下载安装教程 - 兼容老旧Windows系统

SoapUI 4.6.4(32位版) 是个老版本的测试工具,专门给 32位 Windows 电脑 用的。现在最新版都是 64 位的了,但如果你还在用老系统,可能还得找这个旧版。 SoapUI 4.6.4工具下载:https://pan.quark.cn/s/c07381db8102 这…

【AI量化第24篇】KhQuant 策略框架深度解析:让策略开发回归本质——基于miniQMT的量化交易回测系统开发实记

我是Mr.看海,我在尝试用信号处理的知识积累和思考方式做量化交易,应用深度学习和AI实现股票自动交易,目的是实现财务自由~ 目前我正在开发基于miniQMT的量化交易系统——看海量化交易系统。 本篇要讲到量化的核心了——策略。说白了每个投资者…