ArrayList vs LinkedList,HashMap vs TreeMap:如何选择最适合的集合类?
精心整理了最新的面试资料和简历模板,有需要的可以自行获取
点击前往百度网盘获取
点击前往夸克网盘获取
在 Java 开发中,集合类的选择直接影响程序的性能和代码的可维护性。不同的数据结构适用于不同的场景,盲目使用可能导致内存浪费、性能下降甚至逻辑错误。本文将从底层原理、时间复杂度、内存占用和典型场景出发,对比分析 ArrayList vs LinkedList、HashMap vs TreeMap,帮助你做出合理选择。
一、ArrayList vs LinkedList:线性结构的对决
1. 底层数据结构
- ArrayList:基于动态数组实现,内存连续分配。
- LinkedList:基于双向链表实现,节点通过指针连接。
2. 时间复杂度对比
| 操作 | ArrayList | LinkedList |
|---|---|---|
| 随机访问(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+),但仍需设计良好的哈希函数。
- 线程安全:二者均非线程安全,多线程场景需用
ConcurrentHashMap或Collections.synchronizedMap。
三、综合选择策略
-
根据操作类型选择:
- 频繁随机访问 →
ArrayList。 - 频繁插入删除 → 根据位置选择
LinkedList或ArrayList。 - 需要排序 →
TreeMap。 - 纯键值存取 →
HashMap。
- 频繁随机访问 →
-
根据数据规模选择:
- 小数据量:结构差异对性能影响较小,优先考虑代码可读性。
- 大数据量:关注时间复杂度,避免线性操作(如
LinkedList的遍历)。
-
通过性能测试验证:理论分析需结合实际场景测试(如 JMH 基准测试)。
四、总结
- ArrayList:随机访问之王,尾部操作高效,内存友好。
- LinkedList:头尾插入删除利器,但慎用于遍历和中间操作。
- HashMap:快速键值存取,无序场景首选。
- TreeMap:有序键值对的终极选择,支持复杂查询。
最终,选择集合类时需明确需求:是更关注速度、内存,还是功能特性?理解底层原理,结合实际场景,才能写出高效健壮的代码。
相关文章:
ArrayList vs LinkedList,HashMap vs TreeMap:如何选择最适合的集合类?
精心整理了最新的面试资料和简历模板,有需要的可以自行获取 点击前往百度网盘获取 点击前往夸克网盘获取 在 Java 开发中,集合类的选择直接影响程序的性能和代码的可维护性。不同的数据结构适用于不同的场景,盲目使用可能导致内存浪费、性能…...
uniapp的h5,打开的时候,标题会一闪而过应用名称,再显示当前页面的标题
问题: 微信小程序,通过webview打开了uniapp创建的h5,但是打开h5时,会先显示h5的应用名称,然后才切换为该页面的标题。 过程: 查过很多资料,有说修改应用名称,有说设置navigationS…...
玩转Docker | 使用Docker搭建Van-Nav导航站
玩转Docker | 使用Docker搭建Van-Nav导航站 前言一、Van-Nav介绍van-nav 简介主要特点二、系统要求环境要求环境检查Docker版本检查检查操作系统版本三、部署Van-Nav服务下载镜像创建容器检查容器状态检查服务端口安全设置四、访问Van-Nav应用访问Van-Nav首页登录后台管理五、添…...
Margin和Padding在WPF和CSS中的不同
CSS和WPF中 margin 与 padding 在方向上的规定基本一致,但在使用场景和一些细节上有所不同。 CSS - 方向规定: margin 和 padding 属性可以分别指定上、右、下、左四个方向的值。例如 margin:10px 20px 30px 40px; 表示上外边距为10px、右外边距为20…...
.NET Core DI(依赖注入)的生命周期及应用场景
在.NET中,依赖注入(DI,Dependency Injection)是一种设计模式,它通过将依赖关系注入到类中,而不是让类自己创建依赖项,来降低类之间的耦合度。这使得代码更加模块化、灵活和易于测试。在.NET中&a…...
新技术学习方法
新技术学习方法 学习新技术的路线需要结合系统性规划与实践验证,以下是基于行业经验和学习科学整理的高效路径框架,适用于编程语言、开发框架、前沿技术等领域: 一、明确学习目标与动机(战略层) 场景化需求分析 明确…...
内网dns权威域名服务器搭建
目录 一、背景 二、dns简介 1、dns服务器类型 1、缓存域名服务器 2、主域名服务器 3、从域名服务器 2、dns解析过程 1、递归查询 2、迭代查询: 3、dns服务器类型 1、根域名服务器 2、顶级域名服务器 顶级域名可分为两类 顶级域名服务器的重要性体现在…...
爱普生SG2520VGN差分晶振5G基站的时钟解决方案
在 5G 通信时代,数据流量呈爆发式增长,5G 基站作为信号的核心中转枢纽,承载着前所未有的数据传输与处理重任。从海量的物联网设备连接,到高速移动用户的数据交互,每一个环节都对基站的性能提出了严苛要求。而精准稳定的…...
Linux中设置文件开机自启
###方法有很多,这里只分享一个systemd的方法 1.创建service文件 在/etc/systemd/system/下创建,自己命名,后缀是.service 创建方式有两种: 进入/etc/systemd/system创建,创建后使用sudo vim编辑使用sudo nano /etc/…...
C# 基类型和派生类型之间的转型
1.什么是基类型和派生类 基类型:父类,所有子类都继承自它。 派生类型:子类,继承了父类的属性和方法,还可以添加自己的新功能。 例子: class Animal { }//基类型 class Dog : Animal { }//派生类型 这…...
AWTK-MVVM 如何让多个View复用一个Model记录+关于app_conf的踩坑
前言 有这么一个业务,主界面点击应用窗口进入声纳显示界面,声纳显示界面再通过按钮进入菜单界面,菜单界面有很多关于该声纳显示界面的设置项,比如量程,增益,时间显示,亮度,对比度等…...
MySQL视图相关
视图基础概念 定义:视图是一条SELECT语句执行后返回的结果集,是对若干基本表的引用,是一张虚表,不存储具体数据。特性:依赖基本表,基本表数据改变时视图数据也随之改变;限定条件下可进行增删改…...
blender 超逼真角色daz 纹理材质 humanpro插件
https://www.youtube.com/KhanhVo-zp9lh/featured https://superhivemarket.com/products/humanpro https://superhivemarket.com/products/humanpro HUMANPRO 插件 - BLENDER HumanPro 是一款专为帮助用户轻松快速地创建高度精细逼真的人体皮肤纹理和复杂皱纹而设计的插件…...
C++简易日志
文章目录 main.cppLog.hLog.cppClassAuxMacro.hSingleton.h main.cpp #include "Log.h"int main() {LogInfo << "main start";int i 1;double d 3.14;LogInfo << "i " << i << ", d " << d;getcha…...
kotlin音乐之自定义唱片组件(简单版本)
代码地址 import android.animation.ObjectAnimator import android.animation.ValueAnimator import android.content.Context import android.os.Binder import android.util.AttributeSet import android.view.animation.LinearInterpolator import androidx.appcompat.widg…...
Redis 版本变更的变化
Redis 版本变更的变化 以下是 Redis 主要版本的清单及其核心功能变化的梳理,按时间顺序整理关键版本演进 8版本没有整理: Redis 1.0 (2009) 初始版本:发布首个稳定版本,支持基本键值存储。 核心特性: 支持字符串&…...
flink扫盲-调整checkpoint的时间会影响原来的state数据吗
一、核心结论 原 State 数据仍可用 只要作业的 拓扑结构(DAG) 和 状态类型(StateDescriptor) 未发生变更,旧的 Checkpoint 依然有效。Checkpoint 间隔调整仅影响 新生成的 Checkpoint…...
文本纠错WPS插件:提升文档质量的利器
文本纠错WPS插件:提升文档质量的利器 引言 在数字化办公日益普及的今天,文档的质量直接影响到我们的工作效率和形象。一个错别字或标点错误,可能就会让我们的专业形象大打折扣。今天,我要向大家介绍一款强大的WPS插件——文本纠…...
多光谱相机与高光谱相机的区别
多光谱相机与高光谱相机均属于光谱成像设备,但两者在光谱分辨率、波段数量、数据维度及应用场景上存在显著差异。以下是详细的对比分析: 一、核心差异对比 二、工作原理差异 多光谱相机 波段选择:根据目标物特性预设特定…...
MVCC详细介绍及面试题
目录 1.什么是mvcc? 2.问题引入 3. MVCC实现原理? 3.1 隐藏字段 3.2 undo log 日志 3.2.1 undo log版本链 3.3 readview 3.3.1 当前读 编辑 3.3.2 快照读 3.3.3 ReadView中4个核心字段 3.3.4 版本数据链访问的规则(了解&#x…...
电商企业如何实现流程精细化?日事清「标准化+可视化+自动化」全流程管理实战解析
电商企业在业务快速发展中,往往会遇到如下问题: 1、店铺多款产品需要上新维护,但工作重点往往不清晰,员工经常忘记,没做也不当回事; 2、员工做事经常错漏细节,犯低级错误; 3、人员…...
威锋VL822-Q7T10GHUB芯片适用于扩展坞显示器
一、概述 VL822-Q7T是VIA Lab(威盛电子旗下专注于USB相关技术研发的子公司)精心打造的一款高性能USB 3.1 Gen2集线器控制器芯片。在当今数字化时代,USB接口作为设备连接与数据传输的核心通道,其性能与稳定性至关重要。VL822-Q7T凭…...
交换机与路由器的默契配合:它们的联系与区别
交换机与路由器的默契配合:它们的联系与区别 一. 交换机与路由器的基本功能1.1 交换机的功能1.2 路由器的功能 二. 交换机和路由器的区别三. 交换机和路由器的联系3.1 数据转发的协作3.2 网络分段与分隔3.3 协同工作提供互联网接入 四. 交换机和路由器的联合应用场景…...
Git提交规范及最佳实践
Git 提交规范通常是为了提高代码提交的可读性、可维护性和自动化效率(如生成 ChangeLog)。以下是常见的 Conventional Commits 规范,结合社区最佳实践总结而成: 1. 提交格式 每次提交的 commit message 应包含三部分:…...
Ubuntu 常用命令行指令
1. 文件与目录操作 命令作用示例ls列出目录内容ls -l(详细列表)cd切换目录cd ~/Documentspwd显示当前目录路径pwdmkdir创建目录mkdir new_folderrm删除文件rm file.txtrm -r递归删除目录rm -r old_dircp复制文件cp file.txt backup/mv移动/重命名文件mv…...
Redis 分布式锁+秒杀异步优化
文章目录 问题思路setnx实现锁误删问题和解决方案Redis Lua脚本问题引出解决方案 setnx实现的问题Redission快速入门redission可重入锁原理 秒杀优化(异步优化)异步秒杀思路秒杀资格判断Redis消息队列 问题 比如我们两个机器都部署了我们项目,这里nginx使用轮询的方…...
Git_获取GitLab的token方法(访问令牌)
一、操作步骤 GitLab-获取token(访问令牌)主要步骤:以及相关截图 登录 GitLab 打开 GitLab 网站并登录你的账号。 进入用户设置 点击右上角头像 → Edit profile → 左侧菜单选择 Access Tokens。 创建 Token Token name: 输入名称&#…...
【生活相关-日语-日本-东京-留学生-搬家后或新入驻-水道局申请饮用水(1)-办理手续】
【生活相关-日语-日本-东京-搬家后-水道局申请饮用水-办理手续】 1、前言2、情况说明(1)他人代办(2)打电话(3)网络申请(4)你将会面临什么,主要步骤(5…...
【C语言】--- 预处理详解
预处理详解 1. 预定义符号2. define定义常量2. define 定义宏4. 带有副作用的宏参数5.宏替换的规则6. 宏和函数的对比7. # 和 \##7.1#运算符 7.2 \##运算符8. 命名约定9.#undef10.命令行定义11.条件编译12. 头文件的包含12.1 头文件被包含的方式12.1.1 头文件的本地包含12.1.2 …...
【Axure视频教程】标准金额格式转换
今天教大家在Axure制作标准金额格式转换的原型模板,具体效果可以参考下方视频,该教程从0开始制作,手把手教学,无论是新手小白还是有一定基础的同学,都可以学习的哦。 【视频教程——试看版】 【Axure教程】标准金额格…...
