常见集合篇(二)数组、ArrayList与链表:原理、源码及业务场景深度解析

news2025/4/3 1:00:49

常见集合篇:数组、ArrayList与链表:原理、源码及业务场景深度解析

  • 常见集合篇(二)数组、ArrayList与链表:原理、源码及业务场景深度解析
    • 1. 数组
      • 1.1 数组概述
        • 1.1.1 数组的定义与特点
        • 1.1.2 业务场景举例
      • 1.2 寻址公式
        • 1.2.1 寻址公式原理
        • 1.2.2 业务场景举例
      • 1.3 操作数组的时间复杂度
        • 1.3.1 查询操作
        • 1.3.2 插入操作
        • 1.3.3 删除操作
    • 2. ArrayList源码分析
      • 2.1 成员变量
        • 2.1.1 核心成员变量
        • 2.1.2 业务场景举例
      • 2.2 构造方法
        • 2.2.1 无参构造方法
        • 2.2.2 指定容量构造方法
        • 2.2.3 集合构造方法
      • 2.3 ArrayList源码分析
        • 2.3.1 添加元素源码
        • 2.3.2 获取元素源码
        • 2.3.3 删除元素源码
      • 2.4 面试题:`ArrayList list = new ArrayList(10);` 的扩容几次?
        • 2.4.1 原理分析
        • 2.4.2 业务场景举例
      • 2.5 面试题:数组和List转换
        • 2.5.1 数组转List
        • 2.5.2 List转数组
    • 3. 链表
      • 3.1 单向链表
        • 3.1.1 结构
        • 3.1.2 业务场景举例
      • 3.2 单向链表时间复杂度
        • 3.2.1 查询操作:O(n)
        • 3.2.2 插入操作:O(1)(已知前节点)
        • 3.2.3 删除操作:O(1)(已知节点)
      • 3.3 双向链表
        • 3.3.1 结构
        • 3.3.2 业务场景举例
      • 3.4 双向链表时间复杂度
        • 3.4.1 查询操作:O(n)
        • 3.4.2 插入操作:O(1)(已知节点)
        • 3.4.3 删除操作:O(1)(已知节点)
      • 3.5 面试题:ArrayList和LinkedList的区别
        • 3.5.1 存储结构
        • 3.5.2 查询操作
        • 3.5.3 插入/删除操作
        • 3.5.4 内存占用

常见集合篇(二)数组、ArrayList与链表:原理、源码及业务场景深度解析

1. 数组

1.1 数组概述

1.1.1 数组的定义与特点

数组是线性数据结构,在内存中占据连续空间,存储相同类型元素。核心特点:

  • 随机访问高效:通过索引定位元素,时间复杂度O(1)。
  • 插入/删除复杂:可能移动后续元素,时间复杂度O(n)。
1.1.2 业务场景举例
  • 电商商品信息存储:电商用double[] productPrices存储商品价格,通过索引快速获取价格,如productPrices[100]
  • 游戏角色属性管理:游戏中int[] roleAttributes存储角色属性(生命值、魔法值等),方便访问。

1.2 寻址公式

1.2.1 寻址公式原理

公式:address = base_address + index * data_type_size。用于计算数组元素内存地址。

1.2.2 业务场景举例
  • 数据库索引底层实现:数据库索引数组,首地址1000int类型(4字节),索引5的元素地址:1000 + 5 * 4 = 1020,快速定位数据。
  • 图形渲染像素存储:图像像素数组,首地址2000,4字节/像素,索引10的像素地址依公式计算,显卡读取渲染。

1.3 操作数组的时间复杂度

1.3.1 查询操作
  • 时间复杂度:O(1)。
  • 业务场景:社交平台用int[] likeCounts存储动态点赞数,通过索引瞬间获取点赞数。
1.3.2 插入操作
  • 时间复杂度:O(n)。
  • 业务场景:教育平台课程章节数组,插入新章节需移动后续章节,时间随章节数增加。
1.3.3 删除操作
  • 时间复杂度:O(n)。
  • 业务场景:金融交易系统订单数组,删除订单需前移后续订单编号,操作时间与订单量相关。

2. ArrayList源码分析

2.1 成员变量

2.1.1 核心成员变量
  • elementData:存储元素的数组。
  • size:记录元素数量。
  • DEFAULT_CAPACITY:默认容量10。
2.1.2 业务场景举例
  • 新闻资讯APPArrayList<News> newsList存储新闻,size记录新闻数,动态管理数据。

2.2 构造方法

2.2.1 无参构造方法
  • 初始化为空数组,首次添加元素扩容。
  • 业务场景:视频平台ArrayList<Video> cacheList,初始无数据,后续缓存视频。
2.2.2 指定容量构造方法
  • 预分配空间,避免频繁扩容。
  • 业务场景:电商促销ArrayList<PromotionProduct> productList = new ArrayList<>(50),预加载50款商品。
2.2.3 集合构造方法
  • 转换其他集合数据。
  • 业务场景:社交平台ArrayList<User> friendList = new ArrayList<>(Arrays.asList(oldFriendArray)),迁移好友数据。

2.3 ArrayList源码分析

2.3.1 添加元素源码
  • 容量不足时,新容量为旧的1.5倍,Arrays.copyOf复制元素。
  • 业务场景:外卖平台订单ArrayList,第11单触发扩容,确保订单存储。
2.3.2 获取元素源码
  • get(int index)直接返回元素,O(1)。
  • 业务场景:在线教育Homework homework = homeworkList.get(studentIndex),快速获取学生作业。
2.3.3 删除元素源码
  • 移动后续元素,置空尾元素防内存泄漏。
  • 业务场景:旅游平台删除订单,后续订单前移,保持编号逻辑。

2.4 面试题:ArrayList list = new ArrayList(10); 的扩容几次?

2.4.1 原理分析

初始容量10,第11个元素触发扩容为15,后续依1.5倍扩容。

2.4.2 业务场景举例
  • 电商秒杀ArrayList<SeckillProduct> productList,首次扩容在添加第11个商品时,支撑活动商品展示。

2.5 面试题:数组和List转换

2.5.1 数组转List
  • Arrays.asList(),需再包装为ArrayList以支持增删。
  • 代码Integer[] array = {1, 2, 3}; List<Integer> list = new ArrayList<>(Arrays.asList(array));
  • 场景:金融系统将数据库查询数组转为List,便于业务处理。
2.5.2 List转数组
  • toArray()指定数组类型。
  • 代码List<Integer> list = new ArrayList<>(); Integer[] array = list.toArray(new Integer[0]);
  • 场景:游戏开发将角色List转数组,适配渲染引擎。

3. 链表

3.1 单向链表

3.1.1 结构

节点含数据域和指向下一节点的指针,头节点入口,尾节点指针为null

3.1.2 业务场景举例
  • 消息队列:即时通讯APP消息发送队列,新消息添加到尾部,按顺序发送。
  • 浏览器历史记录:存储访问页面,回退时遍历链表。

3.2 单向链表时间复杂度

3.2.1 查询操作:O(n)
  • 场景:物流配送路线查询站点,需遍历链表。
3.2.2 插入操作:O(1)(已知前节点)
  • 场景:音乐播放列表插入歌曲,修改前节点指针。
3.2.3 删除操作:O(1)(已知节点)
  • 场景:任务管理系统删除任务,跳过目标节点。

3.3 双向链表

3.3.1 结构

节点含前驱、后继指针,可双向遍历。

3.3.2 业务场景举例
  • 电商购物车:调整商品顺序,双向指针支持前后移动。
  • 操作系统内存管理:内存块分配回收,双向链表快速定位合并。

3.4 双向链表时间复杂度

3.4.1 查询操作:O(n)
  • 场景:图书馆检索书籍,可能遍历全表。
3.4.2 插入操作:O(1)(已知节点)
  • 场景:社交平台插入好友,修改前后节点指针。
3.4.3 删除操作:O(1)(已知节点)
  • 场景:视频平台剪辑片段,跳过删除片段。

3.5 面试题:ArrayList和LinkedList的区别

3.5.1 存储结构
  • ArrayList:连续内存,数组存储。
  • LinkedList:非连续内存,节点连接。
  • 场景对比:相册图片,随机访问多用ArrayList;动态编辑多用LinkedList
3.5.2 查询操作
  • ArrayList:O(1)。
  • LinkedList:O(n)。
  • 场景对比:股票系统实时股价,随机访问用ArrayList;顺序处理交易记录,LinkedList可满足。
3.5.3 插入/删除操作
  • ArrayList:O(n)。
  • LinkedList:O(1)(已知节点)。
  • 场景对比:文本编辑器,插入删除频繁用LinkedList;代码编辑器跳转行,用ArrayList
3.5.4 内存占用
  • ArrayList:可能空间浪费(预分配)。
  • LinkedList:节点指针占额外内存。
  • 场景对比:嵌入式设备,数据稳定用ArrayList;动态变化大,权衡后选LinkedList

通过对数组、ArrayList和链表的深入解析及业务场景实践,开发者可根据实际需求选择数据结构,优化程序性能,为电商、社交、金融等领域的系统高效运行提供保障。

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

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

相关文章

redis 缓存命中率降低,该如何解决?

命中率降低 Redis 缓存命中率降低&#xff0c;可能是由于多个因素导致的&#xff0c;比如缓存未命中、缓存污染、缓存淘汰过快等。针对不同情况&#xff0c;可以采取以下优化措施&#xff1a; 1. 分析缓存命中率下降的原因 在优化之前&#xff0c;先使用 Redis 监控工具 分析…

LiteDB 数据存储与检索效率优化的最佳实践指导

一、引言 在当今数字化时代,数据处理和存储变得至关重要。对于小型项目或者嵌入式系统而言,需要一种轻量级、高效且易于使用的数据库解决方案。LiteDB 作为一款嵌入式的 NoSQL 数据库,因其零配置、易于集成等特点,受到了开发者的青睐。然而,若要充分发挥其性能优势,就需…

数据结构——Map和Set

1. 搜索树 1. 概念 ⼆叉搜索树⼜称⼆叉排序树&#xff0c;它可以是⼀棵空树&#xff0c;或者是具有以下性质的⼆叉树: • 若它的左⼦树不为空&#xff0c;则左⼦树上所有节点的值都⼩于根节点的值 • 若它的右⼦树不为空&#xff0c;则右⼦树上所有节点的值都⼤于根节点的值…

装饰器模式:如何用Java打扮一个对象?

引言装饰器模式具体实例共有接口类具体被装饰类抽象装饰器类具体装饰器类 测试装饰器模式的实际应用Java I/O 体系游戏开发中的角色装备系统 总结 引言 在生活中&#xff0c;我们都知道一句话&#xff0c;“人靠衣装马靠鞍”&#xff0c;如果想要让自己在别人眼里看起来更加好…

OpenCV 图形API(或称G-API)(1)

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 引言 OpenCV 图形API&#xff08;或称G-API&#xff09;是一个新的OpenCV模块&#xff0c;旨在使常规图像处理更快且更便携。通过引入一种新的基于图的执行…

学以致用,基于OpenCV的公摊面积估算程序

由于很多户型图并没有标注各个房间或者走廊的面积&#xff0c;亦或比较模糊&#xff0c;且很多人并不具备迅速口算多个小数相加再做除法的能力&#xff0c;本帖通过程序粗略计算公摊比例。由于非专业人士&#xff0c;公摊面积涉及到很多建筑学的专业公式&#xff0c;因此本帖只…

d2025331

目录 一、删除有序数组中的重复项II 二、删除有序数组中的重复项 三、数字转罗马格式 一、删除有序数组中的重复项II 一下写过&#xff0c;挺舒服&#xff01; 1、统计超出2的数量有多少&#xff0c;仅保留2个重复数字 2、有多少次就从后往前覆盖几次 public int removeDupl…

QT6开发指南笔记(1)QT简介,安装

&#xff08;1&#xff09;刚刚结束了 C 的学习&#xff0c;谢谢阿西老师的教导&#xff0c;开始 QT 的学习&#xff0c;运用 C &#xff0c;而非 QML 。 保持知识的连贯性。 QT 公司 &#xff1a; &#xff08;2&#xff09;接着介绍 QT 的安装&#xff1a; 提取到的…

Redis BitMap 实现签到及连续签到统计

一、引言 用户签到功能是很多应用都离不开的一个板块&#xff0c;单词打开、QQ达人等等为我们所熟知&#xff0c;这项功能该如何实现呢&#xff0c;一些朋友可能想当然的觉得无非将每日的签到数据记录下来不就好了&#xff0c;不会去细想用谁记录&#xff0c;如何记录才合适。 …

GO语言杂记(文章持续更新)

1、MAIN冲突 在一个文件夹下有两个go文件同时写了main函数&#xff0c;将会报错&#xff0c;main函数只能在main包中。 实则不然&#xff0c;有些环境下并不会报错。 2、gofmt命令---自动对齐 命令作用&#xff1a;将go文件代码自动缩进。 gofmt -w escapecharprac.go

OS6.【Linux】基本指令入门(5)

目录 1.配置公网IP到XShell中 2.日志 定义和作用 3.一些指令 date %Y、%m、%d、%H、%M、%S、%X、%F %s 时间戳的特点 时间戳的转换 cal cal 年份 其他选项 ★find★ whereis grep 练习 -v选项 -n选项 -i选项 多文件查找 特定目录下查找 1.配置公网IP到XShe…

Moo0 VideoResizer,简单高效压缩视频!

Moo0 VideoResizer 是一款免费、轻量级的视频压缩工具&#xff0c;支持通过调整文件大小、屏幕尺寸或比特率等方式实现高效视频压缩。其核心优势在于操作简单且无需破解&#xff0c;可直接下载安装使用‌。软件注重用户友好性&#xff0c;采用非破坏性压缩技术&#xff0c;所有…

【开发问题记录】高德地图 Web 端开发详解:高德地图 API 最佳实践指南(安装、marker添加、逆向地理编码、实际业务案例实操)

文章目录 1、引入高德地图的准备工作2、高德地图 JS API 使用方式2.1 JS API Loader2.1.1 使用 script 标签加载loader2.1.2 NPM 安装loader 2.2 script 标签加载 JS API 脚本2.2.1 同步加载2.2.2 异步加载 3、在 vue3 项目中使用3.1 安装 js api loader3.2 在组件中使用 4、实…

快速入手-基于Django-rest-framework的自身组件权限认证(九)

1、在对应的视图函数里增加认证&#xff08;局部起作用&#xff0c;不全局生效&#xff09; 导入类&#xff1a; from rest_framework.authentication import ( BasicAuthentication, SessionAuthentication, ) from rest_framework.permissions import IsAuthentica…

【复活吧,我的爱机!】Ideapad300-15isk拆机升级:加内存条 + 换固态硬盘 + 换电源

写在前面&#xff1a;本博客仅作记录学习之用&#xff0c;部分图片来自网络&#xff0c;如需引用请注明出处&#xff0c;同时如有侵犯您的权益&#xff0c;请联系删除&#xff01; 文章目录 前言升级成本升级流程电池健康度加内存条和换内存条光驱位加装机械硬盘更换电池重装系…

基于Spring AI开发本地Jenkins MCP Server服务

前言 首先介绍下MCP是什么&#xff1f; MCP是由开发了 Claude 模型的 Anthropic 公司2024年11月提出并开源的一项开放标准&#xff0c;全称&#xff1a;Model Context Protocol&#xff0c;它是一个开放协议&#xff0c;它使 LLM 应用与外部数据源和工具之间的无缝集成成为可能…

【nvidia】Windows 双 A6000 显卡双显示器驱动更新问题修复

问题描述&#xff1a;windows自动更新nvidia驱动会导致只检测得到一个A6000显卡。 解决方法 下载 A6000 驱动 572.83-quadro-rtx-desktop-notebook-win10-win11-64bit-international-dch-whql.exehttps://download.csdn.net/download/qq_18846849/90554276 不要直接安装。如…

《SRv6 网络编程:开启IP网络新时代》第2章、第3章:SRv6基本原理和基础协议

背景 根据工作要求、本人掌握的知识情况&#xff0c;仅针对《SRv6 网络编程&#xff1a;开启IP网络新时代》书籍中涉及的部分知识点进行总结梳理&#xff0c;并与工作小组进行分享&#xff0c;不涉及对原作的逐字搬运。 问题 组内同事提出的问题&#xff1a;本文缺扩展头描述…

如何将AI模型返回的字符串转为html元素?

场景&#xff1a; 接入deepseek模型的api到我们平台&#xff0c;返回的字符串需要做下格式化处理。 返回的数据是这样的&#xff1a; {"role": "assistant","content": "<think>\n嗯&#xff0c;用户问的是“星体是什么”。首先&am…

【PCIE711-214】基于PCIe总线架构的4路HD-SDI/3G-SDI视频图像模拟源

产品概述 PCIE711-214是一款基于PCIE总线架构的4路SDI视频模拟源。该板卡为标准的PCIE插卡&#xff0c;全高尺寸&#xff0c;适合与PCIE总线的工控机或者服务器&#xff0c;板载协议处理器&#xff0c;可以通过PCIE总线将上位机的YUV 422格式视频数据下发通过SDI接口播放出去&…