Java集合源码分析之基础(一):数组与链表

软考中级软件设计师备考指南:从零构建高效复习体系 软件工程是指导软件开发与维护的系统化、规范化方法,其核心在于通过一系列原则、方法和工具,提升软件的质量、可维护性和开发效率。其原理涵盖从需求分析、系统设计到测试维护的全生命周期管理,强调结构化与过程控制。掌握软件工程知识体系,对于开发者从代码实现者向系统设计者转型具有重要价值,能有效应用于系统架构设计、项目管理及团队协作等场景。本文聚焦于**软件设计师考试**,深入解析如何系统梳理**软件工程知识体系**,并构建高效的复习路径,帮助考生攻克这一国家级职业资格认证。 阅读详情

数组和链表是数据结构中最基本的部分,也是其余众多数据结构的基础。即使在Java中,这两种结构使用的也很普遍。这里我们会先对它们进行简要分析。

数组

在java中,数组定义为一种基本类型,其可以通过下标获取到对应位置的数据。那么这种结构的数据,在内存中是怎么存放的呢?

数组的结构示意图

正如上图所示,数组在内存中是一段连续的存储单元,每个数据依次放在每个单元中。分析这种结构,我们可以得出以下几个结论:

  • 创建一个数组,必须声明其长度,以在内存中寻找合适的一段连续存储单元。这也意味着数组的大小是固定的,我们无法动态调整其大小。

  • 想要获取数组中第i个元素,其时间复杂度是 O(1),因为可以根据其地址直接找到它。同理修改也是。

  • 数组对查询表现一般,要想查找一个元素,需要遍历,时间复杂度为O(n)。

  • 因为地址连续,想要在数组中插入一个元素是复杂的,因为从插入位置起,后边的所有元素都需要向后移动一位。同理删除也是,只是移动方向为向前。并且,当数组存满时,就无法继续插入了。

  • 因为数组要占据一整块内存,有可能产生许多的碎片,也可能因为找不到合适的内存块,而导致存储失败。

总结起来就是:数组大小固定,查找迅速,增删复杂,需要完整的内存块,容易产生碎片。

链表

链表是一种离散存储结构,其在内存中存储不是连续的,每个数据元素都通过一个指针指向其下一个元素的地址。根据指针域的不同,链表又分为单链表、双向链表、循环链表等,这里我们只分析单链表。示意图如下所示:

 

链表的结构示意图

分析这种结构,我们可以得出以下几个结论:

  • 声明一个链表时,不需要知道其长度,也不需要连续的内存块,所以其大小可以动态调整。

  • 链表的每个元素都分为数据域和指针域,前者是实际存储的数据,后者则指向下一个元素的地址。和数组相比,每个元素需要占用的内存更大了。

  • 要获取链表的第 i 个元素变得复杂,因为其地址存放在它上一个元素的指针域里,所以只能从第一个元素起,进行 i 次操作。同理修改也是。

  • 链表对查询表现也一般,需要遍历,时间复杂度为O(n)。

  • 增加与删除一个元素更方便了,因为没有对内存地址的限制,我们只需要在对应节点合理处理下指针域的值,就可以把一个元素插入链表或者从链表删除。

  • 链表对内存的要求很小,只要能够存储下一个数据元素的内存块都可以使用,因此不会造成碎片化。

总结起来就是:大小可以动态调整,增删迅速,查找较慢,数据元素所占内存略多,不需要整块内存块,不会造成碎片化。

数组与链表的选择

通过以上分析,数组和链表对我们影响最大的几点区别在于:

  • 数组按位置查找迅速,链表增删方便
  • 数组是固定大小,链表可以随时扩充与缩减
  • 链表每个元素占据内存略多于数组
  • 数组和链表在查询方面表现都比较一般,耗时较长

在数据量很小,内容基本固定时,我们选择何种数据结构的影响并不大。但当数据量较大时,如果我们需要对数据进行频繁的插入删除,我们应该选择链表,如果我们需要频繁的获取某个位置的元素,我们应该选择数组。数组与链表并没有明确的优劣之分,根据不同的使用场景进行不同的选择,才是这两种结构使用的最佳方式。

如果您喜欢我的文章!可以关注我哦!

JAVA初级之集合(List集合) Collection集合概述是单例集合的顶层接口,它表示一组对象,这些对象也称为Collection的元素它是单值集合的根接口,如果想使用Collection集合中的功能,需要创建该接口的子类。创建Collection集合的对象多态的方式具体的实现类ArrayListList集合的概述有序集合,这里的有序指的是存取顺序用户可以精确控制列表中每个元素的插入位置,用户可以通过整数索引访问元素,并搜索列表中的元素与Set集合不同,列表通常允许重复的元素List集合的特点存取有序可以重复有索引。 阅读详情

相关推荐

神经元细胞结构刨析(持续更新)

神经细胞的学习笔记

weixin_46596227的博客 2220

java源码系列:链表是什么?数组和它有何不同?(2022-07-28更新完毕)

链表是什么?数组和它有何不同?它更便于我们理解 HashMap源码

鲁迷那的专栏—坚持实践后再写出来! 777

汽车ECU诊断入门:手把手教你用UDS协议(ISO14229)读取和清除故障码

本文详细介绍了如何使用UDS协议(ISO14229)进行汽车ECU诊断,包括故障码读取与清除的完整流程。从诊断环境搭建、UDS协议基础到实战案例分析,手把手教你掌握0x19诊断服务、安全访问机制等核心技能,适用于汽车电子工程师和诊断开发人员。

weixin_33701251的博客 450

Java数据结构--数组和链表

内存空间是所有程序的公共资源,在一个复杂的系统运行环境下,空闲的内存空间可能散落在内存各处。我们知道,存储数组的内存空间必须是连续的,而当数组非常大时,内存可能无法提供如此大的连续空间。在链表中插入节点非常容易。如图 ,假设我们想在相邻的两个节点 n0 和 n1 之间插入一个新节点 P ,则只需改变两个节点引用(指针)即可,时间复杂度为 O(1)。在复杂的系统环境中,程序难以保证数组之后的内存空间是可用的,从而无法安全地扩展数组容量。遍历链表,查找其中值为 target 的节点,输出该节点在链表中的索引。

xd__xy的博客 1275

ArcGIS:根据DEM数据提取区域水系

利用DEM数据提取区域水系是常见的水文分析应用,为了获取区域的矢量水系数据,我们可以通过ArcGIS对高程DEM数据进行水文分析,为地表水流建立模型,进而获取到该地的水系数据,DEM数据精度越高,获取到的水系数据精度也就越高。以下介绍如何用ArcGIS提供的工具提取水系。

Oruizn的博客 9107

【牛股启动线】副图指标使用技术说明,图文案例分享,通达信炒股指标

如上图,在紫色线在黑色虚线上时,在出现紫色柱线时,通常会出现强势拉升的行情​。柱线加长加上紫色线上扬,进场跟随做多抓强势行情,紫色柱线和紫色线同时做多持续则可以继续持股。如上图,副图指标【牛股启动线】,指标信号包括紫色线走势信号和紫色柱线信号,以及底部的四条虚线技术信号​,还有一条绿色的参考线,一条黑色的虚线两天分档线。如上图,参考买点,紫色柱线开始出现时进场买点,在上图标记的位置对应的就是进场买点​。紫色柱线加长+紫色线上扬,多头共振持股,行情继续拉升阶段,持股待涨或顺势​进场做多。

weixin_69760830的博客 1906

浅谈 Java 数组链表

知道了元素的数据类型,知道了内存空间是连续的,那我们肯定也能想到如何去根据索引去获取数组对应的元素了,比如说我获取number[2]的数据,那么我们只需要根据 下标位*数据占用的大小,这样计算就可以得到下标位为2的数据在内存中的位置了,当然真正的计算过程是通过下标位计算指针的偏移量的方式得到的,但逻辑上却是一样的,同时在申请数组的时候还会记录数组在内存开始标记位和结束标记位,通过开始标记位和结束标记位,然后通过索引加上数据类型的大小计算出偏移量就能读取到数组对应下标位的数据。

辉色空间 1018

解锁 Bootloader 不再难!HyperOS澎湃系统小米与红米手机通用

必要时,可以在工具右上角安装驱动模块,手动安装驱动。解决方法:确保手机升级到最新稳定版,登录同一个小米账号,并在。新机型解锁时需要等待一段时间,通常为 7 天。如果账号安全评分较低,解锁等待时间会更长。如果解锁失败提示权限不足,说明账号存在安全问题。出现这个错误时,通常是因为网络不稳定。如果解锁次数已满,需要等到下个月。解锁后,手机会重启,首次开机会稍微慢一些,等耐心等待即可。按钮,开始解锁过程,注意:解锁会清除手机内所有数据。7次,开启开发者选项。,右键解压到指定文件夹。,使用小米账号登录。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 7215

Java数组与链表的区别

数组是物理存储单元上连续、顺序的存储结构,它的每个元素在内存中都是连续紧邻分配的,它所占用的内存空间取决于初始化的长度,一旦创建了一个数组,它的长度就不可改变。而链表与数组正相反,链表是物理存储单元上非连续非顺序的存储结构,它是由一个个结点,通过指针联系起来的,其中每个结点包括数据和指针。使用链表时,不需要指定长度,它的长度是可变的。

qq_57936953的博客 890

Livox激光雷达传感器在Python3中的完整驱动程序:深入剖析OpenPyLivox库的实现和应用

当我们提到激光雷达或激光扫描技术时,Livox激光雷达传感器无疑是业界的佼佼者。尽管Livox提供了基于C++的官方软件和API,但现在,有了OpenPyLivox (OPL) 库,Python开发者们也能够轻松地接入和控制这些高级的激光雷达设备。

qq_38334677的博客 1001

YOLOv8【第一章:基础入门篇·第1节】一文搞定,核心架构深度解析与环境配置!

🏆 本文收录于 《YOLOv8实战:从入门到深度优化》 专栏,该专栏专注于分享我在YOLOv8目标检测模型中的实战经验,涵盖从入门基础到深度优化的全方位解决方案。无论你是计算机视觉的新手,还是具有多年深度学习经验的专家,本专栏都将为你提供高效、可复现的技术方案,助你掌握YOLOv8的核心技术,提升目标检测性能,突破瓶颈,优化模型,并加速项目开发🚀!

**My Coding Family** 2100

JAVA中数组(Array)‌ 和 ‌链表(LinkedList)‌ 是两种基础的数据结构

Java 中,‌数组(Array)‌ 和 ‌链表(LinkedList)‌ 是两种基础的数据结构,各自有不同的特性和适用场景

xiaowangbadan0_0的博客 1288

微信小程序 - [wxapplib]] backgroundfetch privacy fail {“errno”:101,“errMsg”:“private_getBackgroundFetchDa

微信小程序报错之backgroundfetch privacy fail,微信小程序报错WAServiceMainContext.js:1 [wxapplib]] backgroundfetch privacy fail {“errno“:101,怎么解决?问题出现:调用wx.chooseMessageFile报错(开发者工具中正常)用户隐私协议中未声明小程序使用此功能,安卓真机调试报错:backgroundfetch privacy fail ,怎么解决?微信小程序[wxapplib]] backgrou

🏆 前端领域优质创作者 1万+

java链表源码_Java集合源码分析之基础(一):数组与链表

数组和链表是数据结构中最基本的部分,也是其余众多数据结构的基础。即使在Java中,这两种结构使用的也很普遍。这里我们会先对它们进行简要分析。数组在java中,数组定义为一种基本类型,其可以通过下标获取到对应位置的数据。那么这种结构的数据,在内存中是怎么存放的呢?数组的结构示意图正如上图所示,数组在内存中是一段连续的存储单元,每个数据依次放在每个单元中。分析这种结构,我们可以得出以下几个结论:创建一...

weixin_36134871的博客 96

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

java集合源码分析(一):数组与链表

数组和链表是数据结构中最基本的部分,也是众多数据结构的基础。在Java中这两种结构的使用也很广泛。今天就让我们来进行简要分析。 一、数组 在Java中,数组是被定为一种基本类型,其可以通过下标获取到对应位置的数据。 那么这边结构在内存中是怎么存放的呢? 正如上图所示,数组在内存中是一段连续的存储单元,每个数据依次放在每个单元中。分析这种结构,我们可以得出以下几个结论: 1. 创建一个数组,必须声明其长度,这样在内存中可以寻找合适的一段连续存储单元,也就是数组的大小是固定的,我们无法动态调整其大小。 2.

不会编程的派大星的博客 194

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Java集合源码分析(一):数组与链表

链接:https://www.jianshu.com/p/1ee38f446d1b 数组和链表是数据结构中最基本的部分,也是其余众多数据结构的基础。即使在Java中,这两种结构使用的也很普遍。这里我们会先对它们进行简要分析。 1.数组 在java中,数组定义为一种基本类型,其可以通过下标获取到对应位置的数据。那么这种结构的数据,在内存中是怎么存放的呢? 数组的结构示意图 正如上图所示,数组在内存...

应无所住而生其心 487

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

浅说java集合源码分析

学javase已经有一段时间,现在回过头来看看java集合中重要的List与Map的实现原理与源码分析。 直接上图,个人做的总结 来源参考: java核心技术卷一、宋红康javase精讲。

m0_46405589的博客 246

Java中List集合介绍(炒鸡详细呦)

Java中List集合介绍(炒鸡详细呦) 1,Java集合介绍 作为一个程序猿,Java集合类可以说是我们在工作中运用最多、最频繁的类。相比于数组(Array)来说,集合类的长度可变,更加方便开发。 Java集合就像一个容器,可以存储任何类型的数据,也可以结合泛型来存储具体的类型对象。在程序运行时,Java集合可以动态的进行扩展,随着元素的增加而扩大。在Java中,集合类通常存在于java....

偏偏爱吃梨的博客 3万+

Java集合类源码分析:LinkedHashMap如何维护插入顺序

继承自HashMap,在保留HashMap所有特性的基础上,通过维护一个双向链表来记录元素的插入顺序或访问顺序。这使得它既具有HashMap的O(1)时间复杂度的查询性能,又能提供可预测的迭代顺序。java// 基本使用示例// 迭代顺序保证为A->B->C通过巧妙的双向链表设计,在继承HashMap高效查找的基础上,完美解决了哈希表无序的问题。通过扩展节点类添加前后指针插入时自动维护链表顺序支持可选的访问顺序模式迭代器基于链表实现保证顺序通过组合而非修改来扩展功能。

2501_93833736的博客 1785

java集合:(一)认识集合的本质、java两大集合派系的关系梳理

认识集合的本质、java两大集合派系的关系梳理一、认识集合的本质1. 集合的作用2. 为什么会有这么多不同的集合3. 三种通用数据结构的性能特点以及优劣势分析(1)数组(2)链表(3)二叉树搜索二、java两大集合派系的关系梳理 一、认识集合的本质 1. 集合的作用 存储对象的容器 2. 为什么会有这么多不同的集合 java集合中底层的数据结构支持是不一样的,每一种数据结构都有各自的特点和特性,所以针对不同的数据结构在java层面展现出不同的集合类。 比如 ArrayList、HashMap底层数据结构是

qq_35080214的博客 1142

JAVA-基础(Collection集合和List集合)

Collection集合概述是单例集合的顶层接口,它表示一组对象,这些对象也称为Collection的元素JDK 不提供此接口的任何直接实现.它提供更具体的子接口(如Set和List)实现创建Collection集合的对象多态的方式具体的实现类ArrayListCollection集合常用方法方法名说明添加元素从集合中移除指定的元素根据条件进行移除清空集合中的元素判断集合中是否存在指定的元素判断集合是否为空集合的长度,也就是集合中元素的个数。

weixin_57379543的博客 941

Java集合List用法总结

转自:https://www.jianshu.com/p/25aa92f8d681 Java集合 作为一个Developer,Java集合类是我们在工作中运用最多的、最频繁的类。相比于数组(Array)来说,集合类的长度可变,更加适合于现代开发需求; Java集合就像一个容器,可以存储任何类型的数据,也可以结合泛型来存储具体的类型对象。在程序运行时,Java集合可以动态的进行扩展,随着元素的增加而扩大。在Java中,集合类通常存在于java.util包中。 Java集合主要由2大体系构成,分别是Co

别说话写代码的博客 3648

Java 数组与集合性能对比 ArrayListLinkedListVector 底层源码分析

微服务架构下的 Java 接口幂等性设计 Token 机制与唯一索引方案

2501_93753784的博客 829
上一篇: Java程序员不得不会的124道面试题(含答案)
下一篇: Java集合源码分析之基础(二):哈希表
刀哥谈Java
博客等级 码龄8年 110粉丝 84原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值