当前位置: 首页 > article >正文

Java高频面试之集合-03

hello啊,各位观众姥爷们!!!本baby今天来报道了!哈哈哈哈哈嗝🐶

面试官:说说ArrayList和LinkedList的区别

ArrayList 与 LinkedList 的详细对比

一、底层数据结构
特性ArrayListLinkedList
存储结构基于动态数组基于双向链表
内存分配连续内存块非连续内存,节点分散存储
元素访问通过索引直接寻址(时间复杂度 O(1))需要遍历链表(时间复杂度 O(n))
插入/删除需要移动元素(时间复杂度 O(n))修改指针(时间复杂度 O(1),但需先遍历到位置)
空间开销仅存储数据和数组容量,内存紧凑每个节点额外存储前驱和后继指针,内存占用更高

二、核心操作性能对比
1. 随机访问(Get/Set)
  • ArrayList

    • 直接通过索引访问数组元素,时间复杂度 O(1)
    • 示例代码:
      list.get(1000);  // 直接定位到数组第1000个位置
      
  • LinkedList

    • 需要从链表头部或尾部遍历到目标位置,时间复杂度 O(n)
    • 优化技巧:根据索引位置选择从头或尾遍历(如 index < size/2 从头开始)。
    • 示例代码:
      list.get(1000);  // 需要遍历至少1000个节点
      
2. 插入与删除
  • 尾部插入(Add)

    • ArrayList
      • 如果数组未满,直接添加到末尾,时间复杂度 O(1)
      • 如果数组已满,需扩容(通常扩容为原容量的1.5倍)并复制数据,均摊时间复杂度 O(1)
    • LinkedList
      • 直接修改尾节点的指针,时间复杂度 O(1)(无需遍历)。
  • 中间插入(Add at Index)

    • ArrayList
      • 需要将插入位置后的元素后移,时间复杂度 O(n)
      • 示例:在索引 i 处插入元素,需移动 n - i 个元素。
    • LinkedList
      • 先遍历到目标位置(时间复杂度 O(n)),再修改指针(O(1)),总体时间复杂度 O(n)
  • 删除(Remove)

    • ArrayList
      • 类似插入操作,需将后续元素前移,时间复杂度 O(n)
    • LinkedList
      • 遍历到目标节点后修改指针,时间复杂度 O(n)(遍历是主要开销)。

三、内存占用与扩容机制
1. 内存占用
  • ArrayList

    • 内存连续,仅存储数据和数组容量字段。
    • 每个元素占用空间 = 数组槽位大小(如 Integer 为4字节)。
    • 示例:存储1000个整数,数组容量为1000时,总内存 ≈ 1000 * 4B = 4KB。
  • LinkedList

    • 每个节点包含数据、前驱指针、后继指针,内存分散。
    • 每个节点内存开销 ≈ 对象头(12B) + 3个引用(各4B) + 数据 = 至少 24B。
    • 示例:存储1000个整数,总内存 ≈ 1000 * 24B = 24KB(是 ArrayList 的6倍)。
2. 扩容机制
  • ArrayList

    • 默认初始容量为10,扩容时创建新数组并复制数据。
    • 扩容公式:newCapacity = oldCapacity + (oldCapacity >> 1)(即1.5倍)。
    • 扩容代价高,但均摊时间复杂度仍为 O(1)。
  • LinkedList

    • 无扩容概念,每次插入动态创建新节点。
    • 无内存浪费,但频繁插入可能触发GC(节点对象创建/销毁)。

四、应用场景
适合使用 ArrayList 的场景
  1. 频繁随机访问
    • 例如:按索引读取或修改元素(如 list.get(i))。
  2. 尾部插入/删除
    • 例如:日志记录、批量数据处理。
  3. 内存敏感场景
    • 需存储大量数据且希望减少内存占用。
适合使用 LinkedList 的场景
  1. 频繁在头部或中间插入/删除
    • 例如:实现栈(Stack)、队列(Queue)或双向队列(Deque)。
  2. 动态调整数据规模
    • 无需担心扩容问题,适合元素数量变化较大的场景。
  3. 需要实现复杂数据结构
    • 如LRU缓存(通过双向链表快速移动节点)。

五、代码示例与性能测试
1. 尾部插入性能对比
// ArrayList
List<Integer> arrayList = new ArrayList<>();
long start = System.currentTimeMillis();
for (int i = 0; i < 1000000; i++) {arrayList.add(i);  // 均摊 O(1)
}
System.out.println("ArrayList 尾部插入耗时: " + (System.currentTimeMillis() - start) + "ms");// LinkedList
List<Integer> linkedList = new LinkedList<>();
start = System.currentTimeMillis();
for (int i = 0; i < 1000000; i++) {linkedList.add(i);  // O(1)
}
System.out.println("LinkedList 尾部插入耗时: " + (System.currentTimeMillis() - start) + "ms");

结果

  • ArrayList 通常更快(因内存连续,CPU缓存友好)。
  • LinkedList 可能因频繁创建节点对象导致GC开销。
2. 中间插入性能对比
// ArrayList
start = System.currentTimeMillis();
for (int i = 0; i < 1000; i++) {arrayList.add(0, i);  // 每次插入需移动所有元素,O(n)
}
System.out.println("ArrayList 头部插入耗时: " + (System.currentTimeMillis() - start) + "ms");// LinkedList
start = System.currentTimeMillis();
for (int i = 0; i < 1000; i++) {linkedList.add(0, i);  // O(1)
}
System.out.println("LinkedList 头部插入耗时: " + (System.currentTimeMillis() - start) + "ms");

结果

  • LinkedList 明显优于 ArrayList(避免元素移动)。

六、高级特性与注意事项
  1. 迭代器性能

    • ArrayList:迭代器直接通过索引访问,性能高。
    • LinkedList:迭代器需逐个遍历节点,性能较低(但实现了 ListIterator,支持双向遍历)。
  2. 线程安全性

    • 两者均非线程安全,多线程环境下需使用 Collections.synchronizedListCopyOnWriteArrayList
  3. 序列化与克隆

    • ArrayList 重写了 clone(),实现浅拷贝。
    • LinkedList 的克隆需要遍历复制所有节点。

🐮👵

维度ArrayListLinkedList
数据结构动态数组双向链表
访问效率O(1)(随机访问)O(n)
插入/删除O(n)(需移动元素)O(1)(已知位置)或 O(n)(需遍历)
内存占用低(连续存储)高(每个节点额外指针开销)
适用场景随机访问、尾部操作、内存敏感频繁头部/中间插入删除、实现队列/栈

选择建议

  • 优先使用 ArrayList(90%场景更优)。
  • 仅在需要频繁在 头部或中间插入/删除,或实现 队列/栈 时选择 LinkedList。

在这里插入图片描述

相关文章:

Java高频面试之集合-03

hello啊&#xff0c;各位观众姥爷们&#xff01;&#xff01;&#xff01;本baby今天来报道了&#xff01;哈哈哈哈哈嗝&#x1f436; 面试官&#xff1a;说说ArrayList和LinkedList的区别 ArrayList 与 LinkedList 的详细对比 一、底层数据结构 特性ArrayListLinkedList存…...

常用的分布式ID设计方案

常用的分布式ID设计方案 在分布式系统中&#xff0c;生成全局唯一的ID是一个常见的需求。无论是数据库表中的主键&#xff0c;还是消息队列的消息ID&#xff0c;都需要一个高效且可靠的唯一标识符。本文将探讨几种常用的分布式ID设计方案&#xff0c;并分析它们的优缺点。 1. …...

宇树科技再落一子!天羿科技落地深圳,加速机器人创世纪

2025年3月5日&#xff0c;机器人行业龙头宇树科技&#xff08;Unitree&#xff09;在深圳再添新动作——全资子公司深圳天羿科技有限公司正式成立。这家注册资本10万元、法定代表人周昌慧的新公司&#xff0c;聚焦智能机器人研发与销售&#xff0c;标志着宇树科技在华南市场的战…...

【长安大学】苹果手机/平板自动连接认证CHD-WIFI脚本(快捷指令)

背景&#xff1a; 已经用这个脚本的记得设置Wifi时候&#xff0c;关闭“自动登录” 前几天实在忍受不了CHD-WIFI动不动就断开&#xff0c;一天要重新连接&#xff0c;点登陆好几次。试了下在网上搜有没有CHD-WIFI的自动连接WIFI自动认证脚本&#xff0c;那样我就可以解放双手&…...

基于遗传算法的无人机三维路径规划仿真步骤详解

基于遗传算法的无人机三维路径规划仿真步骤详解 一、问题定义 目标:在三维空间内,寻找从起点到终点的最优路径,需满足: 避障:避开所有障碍物。路径最短:总飞行距离尽可能短。平滑性:转折角度不宜过大,降低机动能耗。输入: 三维地图(含障碍物,如立方体、圆柱体)。起…...

【Elasticsearch】索引生命周期管理相关的操作(Index Lifecycle Actions)

Elasticsearch 的Index Lifecycle Management(ILM)是一种用于管理索引生命周期的工具&#xff0c;它允许用户根据索引的使用阶段&#xff08;如热、温、冷、冻结&#xff09;自动执行一系列操作。以下是详细解释 Elasticsearch 中的索引生命周期操作&#xff08;Index Lifecycl…...

计算机毕业设计SpringBoot+Vue.js电商平台(源码+文档+PPT+讲解)

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…...

【杂谈】信创电脑华为w515(统信系统)登录锁定及忘记密码处理

华为w515麒麟芯片版&#xff0c;还有非麒麟芯片版本&#xff0c;是一款信创电脑&#xff0c;一般安装的UOS系统。 准备一个空U盘&#xff0c;先下载镜像文件及启动盘制作工具&#xff0c;连接如下&#xff1a; 百度网盘 请输入提取码 http://livecd.uostools.com/img/apps/l…...

初始提示词(Prompting)

理解LLM架构 在自然语言处理领域&#xff0c;LLM&#xff08;Large Memory Language Model&#xff0c;大型记忆语言模型&#xff09;架构代表了最前沿的技术。它结合了存储和检索外部知识的能力以及大规模语言模型的强大实力。 LLM架构由外部记忆模块、注意力机制和语…...

Vue+el-upload配置minIO实现大文件的切片并发上传、上传进度展示、失败重试功能

vue3el-upload实现切片上传 效果图 初始界面 上传中的界面 上传完成的界面 上传失败的界面 <template><div><el-uploadclass"BigFileUpload"ref"uploadRef"action"#"drag:show-file-list"false":on-change"…...

正则表达式梳理(基于python)

正则表达式&#xff08;regular expression&#xff09;是一种针对字符串匹配查找所定义的规则模式&#xff0c;独立于语言&#xff0c;但不同语言在实现上也会存在一些细微差别&#xff0c;下面基于python对常用的相关内容进行梳理。 文章目录 一、通用常识1.通配符ps.反义 2.…...

Scala 中 val 和对象内部状态的关系

在 Scala 中&#xff0c;val 用于声明不可变的变量&#xff0c;这意味着一旦 val 被赋值&#xff0c;它的引用&#xff08;即指向的内存地址&#xff09;就不能再改变。然而&#xff0c;这并不影响对象内部的状态&#xff08;即对象的属性&#xff09;是否可以改变。具体来说&a…...

skynet简单游戏服务器的迭代

在上一篇的基础上做了改进&#xff0c;主要三个更新&#xff1a; 基础框架引入多一层redis缓存&#xff0c;用于持久化数据&#xff0c;加速数据访问。原本需要通过mysql读取的操作&#xff0c;直接改成与redis层交互&#xff0c;redis会自动写入mysql&#xff0c;保证AP 最终…...

Python学习第八天

查看函数参数 操作之前给大家讲一个小技巧&#xff1a;如何查看函数的参数&#xff08;因为python的底层源码是C语言并且不是开放的&#xff0c;也一直困扰着刚学习的我&#xff0c;这个参数叫什么名之类的看doc又总是需要翻译挺麻烦的&#xff09;。 比如我们下面要说到的op…...

美股回测:历史高频分钟数据的分享下载与策略解析20250305

美股回测&#xff1a;历史高频分钟数据的分享下载与策略解析20250305 在金融分析和投资决策的精细化过程中&#xff0c;美股历史分钟高频数据发挥着至关重要的作用。这些数据以其详尽性和精确性&#xff0c;记录了股票每分钟的价格波动和成交量变化&#xff0c;为投资者提供了…...

【仿muduo库one thread one loop式并发服务器实现】

文章目录 一、项目介绍1-1、项目总体简介1-2、项目开发环境1-3、项目核心技术1-4、项目开发流程1-5、项目如何使用 二、框架设计2-1、功能模块划分2-1-1、SERVER模块2-1-2、协议模块 2-2、项目蓝图2-2-1、整体图2-2-2、模块关系图2-2-2-1、Connection 模块关系图2-2-2-2、Accep…...

服务流程设计和服务或端口重定向及其websocket等应用示例

服务流程设计和服务或端口重定向及其websocket等应用示例 目录 服务或端口重定向的服务设计和websocket等应用示例 一、通用请求控制流程 1.1、入口 1.2、所有GET请求首先预检控制单元 1.3、http请求会分别自动307重定向 1.4、所有请求首先执行跨源控制单元 1.5、然后…...

【数据库】关系代数

关系代数 一、关系代数的概念二、关系代数的运算2.1 并、差、交2.2 投影、选择2.3 笛卡尔积2.4 连接2.5 重命名2.6 优先级 一、关系代数的概念 关系代数是一种抽象的数据查询语言用对关系的运算来表达查询 运算对象&#xff1a;关系运算符&#xff1a;4类运算结果&#xff1a;…...

ubuntu20 安装python2

1. 确保启用了 Universe 仓库 在某些情况下&#xff0c;python2-minimal 包可能位于 Universe 仓库中。你可以通过以下命令启用 Universe 仓库并更新软件包列表&#xff1a; bash复制 sudo add-apt-repository universe sudo apt update 然后尝试安装&#xff1a; bash复制…...

MySQL无法连接到本地localhost的解决办法2024.11.8

问题描述&#xff1a;我的MySQL可以远程连接服务器&#xff0c;但无法连接自己的localhost。 错误提示&#xff1a; 2003 - Cant connet to MySQL server on localhost(10061 "Unknown error")查找问题原因&#xff1a; 1. 检查环境变量是否正确&#xff1a;发现没…...

【Leetcode 每日一题】1328. 破坏回文串

问题背景 给你一个由小写英文字母组成的回文字符串 p a l i n d r o m e palindrome palindrome&#xff0c;请你将其中 一个 字符用任意小写英文字母替换&#xff0c;使得结果字符串的 字典序最小 &#xff0c;且 不是 回文串。 请你返回结果字符串。如果无法做到&#xff0…...

最新Spring Security实战教程(一)初识Spring Security安全框架

&#x1f337; 古之立大事者&#xff0c;不惟有超世之才&#xff0c;亦必有坚忍不拔之志 &#x1f390; 个人CSND主页——Micro麦可乐的博客 &#x1f425;《Docker实操教程》专栏以最新的Centos版本为基础进行Docker实操教程&#xff0c;入门到实战 &#x1f33a;《RabbitMQ》…...

Docker的常用镜像

Docker的常用镜像命令主要包括镜像的查看、搜索、拉取、删除、构建等操作&#xff0c;以下是综合多个来源的总结&#xff1a; 一、基础镜像操作 查看本地镜像 docker images• 显示所有本地镜像&#xff0c;包含仓库名&#xff08;REPOSITORY&#xff09;、标签&#xff08;TAG…...

告别GitHub连不上!一分钟快速访问方案

一、当GitHub抽风时&#xff0c;你是否也这样崩溃过&#xff1f; &#x1f621; npm install卡在node-sass半小时不动&#x1f62d; git clone到90%突然fatal: early EOF&#x1f92c; 改了半天hosts文件&#xff0c;第二天又失效了... 根本原因&#xff1a;传统代理需要复杂…...

MapReduce 深度解析:原理与案例实战

在大数据时代&#xff0c;数据量的爆炸性增长对数据处理提出了前所未有的挑战。MapReduce 作为一种编程模型和并行处理框架&#xff0c;能够让我们在分布式环境下高效处理海量数据。本文将详细讲解 MapReduce 的基本原理、工作流程&#xff0c;并通过一个案例来展示如何应用这种…...

Android中的Fragment是什么以及它有哪些生命周期方法

Android中的Fragment介绍 Fragment&#xff0c;直译为“碎片”或“片段”&#xff0c;是Android中的一种组件&#xff0c;可以看作是Activity的模块化部分。它可以在一个Activity中承载一部分用户界面和逻辑&#xff0c;并能被多个Activity复用。通过Fragment&#xff0c;开发…...

Leetcode 1477. 找两个和为目标值且不重叠的子数组 前缀和+DP

原题链接&#xff1a; Leetcode 1477. 找两个和为目标值且不重叠的子数组 class Solution { public:int minSumOfLengths(vector<int>& arr, int target) {int narr.size();int sum0;int maxnINT_MAX;vector<int> dp(n,maxn);//dp[i]表示以索引i之前的满足要求…...

Ubuntu 22.04安装NVIDIA A30显卡驱动

一、安装前准备 1.禁用Nouveau驱动 Ubuntu默认使用开源Nouveau驱动&#xff0c;需要手动禁用&#xff1a; vim /etc/modprobe.d/blacklist-nouveau.conf # 添加以下内容&#xff1a; blacklist nouveau options nouveau modeset0 # 更新内核并重启&#xff1a; update-initr…...

R语言绘图:韦恩图

韦恩分析 韦恩分析&#xff08;Venn Analysis&#xff09;常用于可视化不同数据集之间的交集和并集。维恩图&#xff08;Venn diagram&#xff09;&#xff0c;也叫文氏图、温氏图、韦恩图、范氏图&#xff0c;用于显示元素集合重叠区域的关系型图表&#xff0c;通过图形与图形…...

Stable Diffusion Prompt编写规范详解

Stable Diffusion Prompt编写规范详解 一、语法结构规范 &#xff08;一&#xff09;基础模板框架 [质量强化] [主体特征] [环境氛围] [风格控制] [镜头参数]质量强化&#xff1a;best quality, ultra detailed, 8k resolution‌主体特征&#xff1a;(1girl:1.3), long …...