「Java」ArrayList 的工作原理

Java arrayList工作原理详解及并发 一.arrayList 概述 1.Java API 中的官方描述: Resizable-array implementation of the List interface. Implements all optional list operations, and permits all elements, including null. In addition to implementing 阅读详情

ArrayList 的工作原理

ArrayList has 是一个内部的普通数组,它充当数据存储。在大多数情况下,我们不指定列表的确切大小。但是内部数组必须有一些大小!它确实如此。 它的默认大小是 10 。

public static void main(String[] args) {
   ArrayList<Car> cars = new ArrayList<>();
}
复制代码

首先,让我们看看添加的新元素是什么样的。首要任务是检查

内部数组在内部数组中是否有足够的空间,

以及是否可以再放一个元素。如果有空间,则将新元素添加到列表的末尾。当我们说“到最后”时,我们并不是指数组中的最后一个位置(那会很奇怪)。我们指的是最后一个当前元素之后的位置。它的索引将是 cars.size() 。我们的列表目前是空的 ( cars.size() == 0 )。因此,新元素将被添加到位置 0。

ArrayList<Car> cars = new ArrayList<>();
Car ferrari = new Car("Ferrari 360 Spider");
cars.add(ferrari);
复制代码

这很清楚。如果我们在中间插入会发生什么,即在其他元素之间?

public static void main(String[] args) {
   ArrayList<Car> cars = new ArrayList<>();
   Car ferrari = new Car("Ferrari 360 Spider");
   Car bugatti = new Car("Bugatti Veyron");
   Car lambo = new Car("Lamborghini Diablo");
   Car ford = new Car("Ford Modneo");

   cars.add(ferrari);
   cars.add(bugatti);
   cars.add(lambo);

   cars.add(1, ford);// add ford to cell 1, which is already occupied
}
复制代码

同样,首先检查数组中是否有足够的空间。如果有足够的空间,则 元素向右移动 ,从我们插入新元素的位置开始。我们在位置 1 插入。换句话说,从位置 3 的元素被复制到位置 4,元素 2 到位置 3,元素 1 到位置 2。

然后我们的新元素被插入到它的位置。前一个元素 (bugatti) 已经从那里复制到一个新位置。

现在让我们看看如果没有地方可以将新元素插入到数组中,这个过程是如何发生的。

当然,首先要检查是否有足够的空间。如果没有足够的空间,则在内部创建一个新数组 ArrayList 其大小是旧数组的大小乘以 1.5 加 1 在我们的例子中,新数组的大小将为 16。所有当前元素将立即复制到那里。

垃圾收集器将删除旧数组,只保留扩展后的新数组。现在有一个新元素的空间。我们将它插入到已被占用的位置 3。现在开始熟悉的程序。所有从索引 3 开始的元素都向右移动一个位置,并且新元素被悄悄添加。

插入完成!我们完成了插入。现在让我们谈谈删除项目。你会记得我们在处理数组时遇到了一个问题:删除元素会在数组中产生“洞”。 每次删除,我们都必须编写自己的代码来执行这个转变。

ArrayList 遵循相同的原则,但它已经实现了这种机制。

它是这样的:

最终我们得到了我们想要的:

lambo 元素已被删除。这里我们从中间移除了一个元素。显然,从列表末尾删除一个元素更快,因为该元素不能简单地删除而无需移动所有其他元素。让我们再次讨论一下内部数组的维度以及它在内存中的排列方式。

扩展阵列需要一些资源。

因此,不要创建 ArrayList 如果您确定它至少有 100 个元素,则使用默认大小。插入第 100 合并元素时,内部数组必须扩展 6 次,并且每次都必须移动所有元素。

  • 从 10 个元素到 16 个元素
  • 从 16 个元素到 25 个元素
  • 从 25 到 38
  • 从 38 到 58
  • 从 58 到 88
  • 从 88 到 133(即旧数组的大小乘以 1.5 加 1)

可以想象,这是相当耗费资源的。因此,如果您已经知道(甚至大约)所需的项目数量,最好创建一个具有特定大小数组的列表:

ArrayList<Car> cars = new ArrayList<>(100);
复制代码

现在将一次性分配 100 个元素的数组的内存,使数组更高效(不需要扩展)。这种策略也有另一面。

当您从 中删除对象时 ArrayList ,内部数组的大小不会自动减小。

假设我们有一个 ArrayList 包含 88 个元素的完整内部数组:

当程序运行时,我们删除了所有 77 因为元素,所以只剩下 11 个:

你已经猜到问题出在哪里了吗?你明白了,内存使用效率低下!我们在这里只使用了 11 个位置,但我们为 88 个元素分配了内存。这比我们需要的多 8 倍! ArrayList 在这种情况下,我们可以使用该类的一种特殊方法来优化内存使用: trimToSize() 此方法将内部数组的长度“修剪”为当前存储在其中的元素数。

现在我们只分配了我们需要的内存!

深入理解Java ArrayList与数组存取效率:一个技术测试案例 ArrayList是 Java 中广泛使用的集合框架之一,它是一个可以根据需要动态增加和减少容量的数组实现。作为List接口的一种实现,ArrayList允许存储重复元素并保持元素的插入顺序。在 Java 中,数组是一种基本的数据结构,它可以存储一系列的元素。这些元素可以是任意类型,包括基本类型和对象类型。数组的定义方式如下:// 声明一个int类型的数组,长度为10数组一旦创建,其长度就固定不变。数组的初始化可以是显式地赋值:或者更简洁的声明方式:这里,数组primes。 阅读详情

相关推荐

ε-差分隐私之拉普拉斯噪声机制(定义 + 证明 + 代码)

ε-差分隐私之拉普拉斯噪声机制 差分隐私的描述 1-范式的定义:使用matlab调用函数norm(x, 1) 更多范式见 范式 差分隐私的定义应该满足 拉普拉斯噪声的证明全过程如下: DP方向差分隐私证明是基本入门!!! -拉普拉斯噪声分布代码 Laplace分布的概率密度函数的形式是: 使用python - matplotlib来绘制概率分布图: import matplotlib.pyplot as plt import numpy as np def laplace_fun

毕业才是起点 1万+

java开发技术之ArrayList的实现原理

1. ArrayList概述 ArrayList是List接口的可变数组的实现。实现了所有可选列表操作,并允许包括 null 在内的所有元素。除了实现 List 接口外,此类还提供一些方法来操作内部用来存储列表的数组的大小。 每个ArrayList实例都有一个容量,该容量是指用来存储列表元素的数组的大小。它总是至少等于列表的大小。随着向ArrayList中不断添加元素,其容量也自动增长。自动增长会带来数据向新数组的重新拷贝,因此,如果可预知数据量的多少,可在构造ArrayList时指定其容量。在添加大量

leeta的博客 520

Ansys Zemax导入CAD文件避坑指南:STL/STEP/IGES格式选择与性能优化

本文深度解析了在Ansys Zemax中导入CAD文件的核心要点与性能优化策略。针对STL、STEP、IGES等主流格式,详细对比了其几何表示、精度与适用场景差异,并提供了基于模型特征的格式选择决策树。文章重点分享了体元、弦公差等高级参数的调优技巧,以及处理复杂装配体和避免精度陷阱的实战指南,旨在帮助光学工程师提升仿真效率与结果可靠性。

weixin_29202687的博客 438

Java进阶:深入理解ArrayList实现原理

ArrayList简介ArrayList就是动态数组,用MSDN中的说法,就是Array的复杂版本,它提供了动态的增加和减少元素,实现了Collection和List接口,可以灵活的设置数组的大小。要注意的是ArrayList并不是线程安全的,因此一般建议在单线程中使用ArrayList。ArrayList的继承关系public class ArrayList<E&...

409

从FPGA/ASIC工程师视角看DDR:手把手拆解Memory Controller、PHY与DRAM芯片的协作流程

本文从FPGA/ASIC工程师视角深入解析DDR内存子系统,详细拆解Memory Controller、PHY与DRAM芯片的协作流程。通过系统架构分解、接口标准解析和实战调试技巧,帮助工程师优化DDR性能并解决常见问题,涵盖地址映射、命令调度、时序校准等关键技术要点。

weixin_42548888的博客 459

通讯软件019——分分钟学会Prosys OPC UA Server配置

本文介绍如何配置Prosys OPC UA Simulation Server,通过本文可以对OPC UA的基本概念有所了解,掌握OPC UA的本质。

zhouwl72的博客 4306

java算法——ArrayList的底层实现原理+仿写

仿写ArrayList底层的增删改查,保姆级教程,一篇文章教你理解算法。

TuT12323的博客 578

第142篇 ROS2安全机制——SROS2和通信加密

本文探讨了机器人系统(特别是基于ROS2)的通信安全问题。文章以医疗机器人面试场景切入,指出产品级系统必须考虑安全机制,而ROS2默认的"信任一切"模式存在严重安全隐患。重点介绍了SROS2解决方案,包括其三大核心能力:身份验证(基于X.509证书)、访问控制(通过XML权限文件)和数据加密(AES-GCM算法)。同时分析了实际应用中的挑战,如性能开销、配置复杂度和生态兼容性问题,并给出了密钥管理、安全审计等实践经验。最后区分了功能安全与信息安全的概念,强调了安全设计的持续性和系统性。

郑伟强dev的专栏 97

ArrayList工作原理,超详解

需要注意的是,ArrayList的大小是动态可变的,当向ArrayList中添加元素时,如果元素个数超过了数组的大小,ArrayList会自动扩容,重新分配一个更大的数组,并将原数组中的元素复制到新数组中。关于第二次扩容阈值与初始指定申请空间关系,根据Java的ArrayList类的规则,第二次扩容操作发生量已经达到最大值时,也就是此时容器实际存储的元素数量等于容器的容量大小,再次添加元素就会触发扩容操作,并将容量扩大为原来的1.5倍,也就是15 * 1.5 = 22.5` 个元素。

qq_61547726的博客 822

Python 爬虫高级实战:HTTPS 证书忽略与代理抓包配置

本文深入解析了HTTPS加密与SSL证书校验机制在爬虫开发中的核心问题及解决方案。文章首先剖析了HTTPS协议架构和证书校验流程,指出爬虫开发中常见的证书异常场景及其负面影响。随后详细介绍了Python主流请求库(requests、httpx、aiohttp)的证书忽略配置方法,包括同步/异步模式下的实现方案。针对代理环境,文章系统比较了HTTP、HTTPS、SOCKS5等代理类型的特性差异,并提供了完整的代理配置示例。特别对中间人抓包场景,阐述了Mitmproxy的工作原理和配置要点。最后提出了工程级爬虫

2503_91057718的博客 87

【Bug已解决】Claude Team Plan 购买席位报错 Payment failed 解决方案

方案适用场景推荐指数检查账单历史状态排查的第一步⭐⭐⭐⭐⭐更换支付方式类型快速尝试是否能绕开问题⭐⭐⭐联系官方支持团队最终解决问题的正规渠道⭐⭐⭐⭐⭐临时过渡方案紧急用人需求的应急处理⭐⭐⭐关注官方修复进度确认属于系统性缺陷的场景⭐⭐⭐⭐Claude Team Plan 增购席位报的问题,社区反馈和实际排查表明很大概率属于平台计费系统在处理按比例分摊费用这类复杂计算链路时的系统性缺陷,而不是用户自身的支付信息填写有误。先排除自身账单历史是否存在异常。

一键难忘的博客 4185

【Java 基础】ArrayList 的底层原理和源码分析

ArrayList 是 Java 中常用的动态数组实现,它的底层是基于数组实现的。当创建一个 ArrayList 对象时,实际上是创建了一个 Object 类型的数组,初始容量为 10。当添加元素时,如果数组已满,ArrayList 会自动扩容,它会创建一个新的数组,并将原数组中的元素复制到新数组中。

激流丶的博客 2589

Matlab基于PSO-MVMD粒子群算法优化多元变分模态分解

Matlab基于PSO-MVMD粒子群算法优化多元变分模态分解

机器学习之心的博客,关注并私信文章链接,获取对应文章源码和数据。 518

java必知必会_Java集合必知必会

10)Java集合的快速失败机制 “fail-fast”?答:是java集合的一种错误检测机制,当多个线程对集合进行结构上的改变的操作时,有可能会产生 fail-fast 机制。例如:假设存在两个线程(线程1、线程2),线程1通过Iterator在遍历集合A中的元素,在某个时候线程2修改了集合A的结构(是结构上面的修改,而不是简单的修改集合元素的内容),那么这个时候程序就会抛出 Concurren...

weixin_35181005的博客 125

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

JAVA 中的 ArrayList 工作原理

ArrayList 是 Java 中基于 ‌动态数组‌ 实现的高效列表

xiaowangbadan0_0的博客 947

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

【Java】ArrayList用法详解

文章目录一、ArrayList类的使用方式二、ArrayList类的声明三、ArrayList类的属性四、ArrayList类的构造器1. 构造指定初始容量空列表2. 无参构造器五、ArrayList类添加元素的方法1. add(E e)2. add(int index, E element)六、ArrayList类查询元素方法1. get()方法——查询指定位置的元素2. indexOf()方法——查询元素第一次出现位置3. lastIndexOf()——查询元素最后一次出现位置4. contains()

ZhShy 1万+

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

【Java】ArrayList 的工作原理

has 是一个内部的普通数组,它充当数据存储。在大多数情况下,我们不指定列表的确切大小。但是内部数组必须有一些大小!它确实如此。 它的默认大小是 10 。 首先,让我们看看添加新元素是什么样的。首要任务是检查内部数组在内部数组中是否有足够的空间,以及是否可以再放一个元素。如果有空间,则将新元素添加到列表的末尾。当我们说“到最后”时,我们并不是指数组中的最后一个位置(那会很奇怪)。我们指的是最后一个当前元素之后的位置。它的索引将是 。我们的列表目前是空的 ( )。因此,新元素将被添加到位置 0。 这很清

VirusScanLog的博客 297

Java ArrayList工作原理及实现

1. 概述 关于Java集合的小抄中是这样描述的: 以数组实现。节约空间,但数组有容量限制。超出限制时会增加50%容量,用System.arraycopy()复制到新的数组,因此最好能给出数组大小的预估值。默认第一次插入元素时创建大小为10的数组。 按数组下标访问元素—get(i)/set(i,e) 的性能很高,这是数组的基本优势。 直接在数组末尾加入元素—add(e)

484

Java学习——ArrayList和LinkedList

ArrayList和LinkedList如果你需要频繁随机访问列表中的元素,或在列表末尾添加元素的操作较多,ArrayList是更好的选择。如果你的应用需要频繁在列表的开始或中间插入或删除元素,LinkedList可能更适合。

bairui6666的博客 1865

Java ArrayList 工作原理及实现

以数组实现。节约空间,但数组有容量限制。超出限制时会增加50%容量,用System.arraycopy()复制到新的数组,因此最好能给出数组大小的预估值。默认第一次插入元素时创建大小为10的数组。按数组下标访问元素—get(i)/set(i,e) 的性能很高,这是数组的基本优势。

Winn~ 222

深入挖掘 ArrayList工作原理及其实现

深入挖掘ArrayList工作原理及实现

WYSCODER的博客 834

【Java基础】ArrayList工作原理

ArrayList 以数组实现。节约空间,但数组有容量限制。超出限制时会增加50%容量,用System.arraycopy()复制到新的数组。因此最好能给出数组大小的预估值。默认第一次插入元素时创建大小为10的数组。按数组下标访问元素-get(i)、set(i,e)的性能很高,这是数组的基本优势。如果按下标插入元素、删除元素-add(i,e)、remove(i)、remove(e),...

andyjiang0310的博客 170

Java ArrayList 详解

Java ArrayList 详解

T_Y_F_的博客 1245

Java ArrayList集合常用方法

创建对象:与其他普通的引用数据类型创建方式完全相同,但要指定容器中存储的数据类型:ArrayList<要存储元素的数据类型> 变量名 = new ArrayList<要存储元素的数据类型>();集合中存储的元素,只能为<>括号中指定的数据类型元素; “<要存储元素的数据类型>”中的数据类型必须是引用数据类型,不能是基本数据类型; 下面给出8种基本数据类型所对应的引用数据类型表示形式:基本数据类型

qq_32946719的博客 1万+
上一篇: Redis 基础数据类型完整版
下一篇: 一个注解搞定,记录项目日志
程序员职业指南
博客等级 码龄4年 2138粉丝 960原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值