ArrayList如何深究?最简单的数组~

目录

数组 Array

为什么数组索引从0开始呢?为什么不从1开始?

ArrayList

成员变量

构造方法

添加和扩容

ArrayList底层的实现原理是什么?

数组和List转换

ArrayList 和 LinkedList区别

底层数据结构

操作数据效率

内存占用

线程安全


数组 Array

数组(Array)是一种用连续的内存空间存储相同数据类型数据的线性数据结构。

寻址公式:a[i] = baseAddress + i * dataTypeSize

假定要想访问int数组中的第3个元素(索引为2),也就是数组的首地址加上2×4字节,所以最终访问到的就是18的位置,也就是第3个元素,索引值为2,数据空间为88。

为什么数组索引从0开始呢?为什么不从1开始?

假设数组索引从1开始,寻址公式就变成了:a[i] = baseAddress + (i-1) * dataTypeSize

根据数组索引获取元素的时候,会用索引和寻址公式来计算内存所对应的数据,寻址公式是数组的首地址+索引乘以存储数据的类型大小(如int就是4字节)

如果索引从1开始,寻址公式中就需要增加一次减法操作,对于cpu来说性能就会下降。

ArrayList

成员变量

在ArrayList中,默认的初始容量就是DEFAULT_CAPACITY = 10。

构造方法

ArrayList有三个构造方法,并且根据不同的传入参数构成了重载。

分别是带初始化容量的构造函数、无参构造函数和传入一个collection。当传入一个collection时,会把这个对象通过toArray方法转成数组,然后将数组的地址赋给elementData。

比如ArrayList list = new ArrayList(10)中这个list其实没有扩容,在初始化的时候传入一个10作为参数,ArrayList会直接初始化一个大小为10的数组。

添加和扩容

当ArrayList第一次添加数据,会先初始化再调用add方法:

进入到add方法,会先确保内部容量为size+1,size初始化是0:

进入ensureCapacityInternal,确保内部容量:

进入calculateCapacity,此时if条件中,DEFAULT_CAPACITY初始化为10,所以会返回10:

再进入ecsureExplicitCapacity,if,如果这个判断大于0,说明容量不够需要扩容:

此时会进入到grow中进行扩容,通过不同的if来判断,先进行容量增加,

oldCapacit + (oldCapacit >> 1),也就是扩容为原来容量的1.5倍。

初始化数组后,再进行数组拷贝。

ArrayList底层的实现原理是什么?

ArrayList底层是用动态数组来实现的,初始容量为0,当第一次添加元素的时候才会初始化容量为10。ArrayList在进行扩容的时候,会扩大为原来的1,5倍,每次扩容都需要拷贝数组。

在add一个数据的时候,会先判断当前数组使用长度(size)加1后足够存下这个数据,这个判断会先计算数据的容量,如果当前数组已使用长度+1后大于当前数组长度,就会调用grow方法进行扩容。确保新增的数据有地方存储之后,会将新的元素添加到size的位置上。

数组和List转换

数组转List:Arrays.asList,也就是使用Arrays工具类的asList方法。

修改数组内容,list会受影响,因为asList方法本质上只是使用Arrays类中的一个内部类ArrayList来构造集合,最终指向的都是同一个内存地址。

List转数组:list.toArray,也就是使用List的toArray方法。

修改数组内容,list不会受影响,toArray底层进行了数组的拷贝,内存地址不同,所以不受影响。

ArrayList 和 LinkedList区别

底层数据结构

ArrayList基于动态数组、LinkedList基于双向链表。

操作数据效率

ArrayList按照索引查询很快,是O(1),ArrayList和LinkedList查找某一元素都需要遍历,O(n)。

ArrayList插入和删除需要改变大量元素位置,平均复杂度为O(n),LinkedList需要遍历链表,平均复杂度为O(n)。

内存占用

ArrayList底层是数组,在内存中连续,节省内存;LinkedList双向链表需要多两个指针,更占内存。

线程安全

都不是线程安全的,要保证线程安全可以使用Collection.synchronizedList。

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

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

相关文章

C++ 分治

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 1.分治法 2.二分搜索 函数传参——数组 3.棋盘覆盖 4.合并排序 5.快速排序 提示:以下是本篇文章正文内容,下面案例可供参考 1.分治法 基…

C++【PCL】利用矩阵对点云进行刚体变换

/** 功能&#xff1a; 点云刚体变换* 头文件&#xff1a; #include <pcl/common/transforms.h>* 功能函数&#xff1a; pcl::transformPointCloud(*pPointCloudIn, *pPointCloudOut, transform_1);*/#include <pcl/io/ply_io.h>#include <iostream>// pcl #i…

Java项目实战II基于微信小程序的文章管理系统的设计与实现 (开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、核心代码 五、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。 一、前言 在信息爆炸的时代&#xff0c;内容创作与管理已成为众…

Conda 管理python开发环境

同步发布于我的网站 &#x1f680; 故事起因: 在公司使用Requests多任务并行开发时遇到了问题&#xff0c;使用 ProcessPoolExecutor 时不能正常发出网络请求&#xff0c;会卡在网络请求发不出去&#xff0c;但是善于用 ThreadPoolExecutor 时是可以的,纠结了很久&#xff0c;一…

LLaMA-Factory 上手即用教程

LLaMA-Factory 是一个高效的大型语言模型微调工具&#xff0c;支持多种模型和训练方法&#xff0c;包括预训练、监督微调、强化学习等&#xff0c;同时提供量化技术和实验监控&#xff0c;旨在提高训练速度和模型性能。 官方开源地址&#xff1a;https://github.com/hiyouga/L…

PGSQL:联合唯一索引的创建和删除

创建联合唯一索引 假设有一个表 your_table&#xff0c;它有多个列&#xff0c;你想在其中的几列上创建一个联合唯一索引。以下是创建联合唯一索引的 SQL 语句&#xff1a; CREATE UNIQUE INDEX idx_unique_columns ON your_table(column1, column2, ...);注意&#xff1a; …

抓包之查看websocket内容

写在前面 本文看下websocket抓包相关内容。 1&#xff1a;正文 websocket基础环境搭建参考这篇文章。 启动后&#xff0c;先看chrome的network抓包&#xff0c;这里我们直接使用is:running来过滤出websocket的请求&#xff1a; 可以清晰的看到发送的内容以及响应的内容。在…

项目介绍和游戏搭建(拼图小游戏)

1. &#xff08;1&#xff09; import javax.swing.*;public class GameJFrame extends JFrame {//游戏主界面&#xff0c;游戏的所有逻辑public GameJFrame(){this.setSize(603,680);this.setVisible(true);//true是展示&#xff0c;flase是隐藏} } &#xff08;2&#xff…

【Maven】Nexus私服

6. Maven的私服 6.1 什么是私服 Maven 私服是一种特殊的远程仓库&#xff0c;它是架设在局域网内的仓库服务&#xff0c;用来代理位于外部的远程仓库&#xff08;中央仓库、其他远程公共仓库&#xff09;。一些无法从外部仓库下载到的构件&#xff0c;如项目组其他人员开发的…

一键生成后端服务,MemFire Cloud重新定义开发效率

作为开发者&#xff0c;特别是独立开发者和小团队成员&#xff0c;大家都知道开发的最大难题之一就是搭建后端服务。要让一个应用从零开始&#xff0c;除了前端的开发工作外&#xff0c;还需要考虑数据库、接口、认证、存储等等一系列繁琐的后台工作。而MemFire Cloud这款神器&…

大模型专栏--Spring Ai Alibaba介绍和功能演示

Spring AI Alibaba 介绍和功能演示 背景 Spring AI Alibaba 开源项目基于 Spring AI 构建&#xff0c;是阿里云通义系列模型及服务在 Java AI 应用开发领域的最佳实践&#xff0c;提供高层次的 AI API 抽象与云原生基础设施集成方案&#xff0c;帮助开发者快速构建 AI 应用。…

《数据挖掘:概念、模型、方法与算法(第三版)》

嘿&#xff0c;数据挖掘的小伙伴们&#xff01;今天我要给你们介绍一本超级实用的书——《数据挖掘&#xff1a;概念、模型、方法与算法》第三版。这本书是数据挖掘领域的经典之作&#xff0c;由该领域的知名专家编写&#xff0c;系统性地介绍了在高维数据空间中分析和提取大量…

AOSP的同步问题

repo sync同步时提示出错: error: .repo/manifests/: contains uncommitted changesRepo command failed due to the following UpdateManifestError errors: contains uncommitted changes解决方法&#xff1a; 1、cd 进入.repo/manifests cd .repo/manifests2、执行如下三…

AI开发:逻辑回归 - 实战演练- 垃圾邮件的识别(二)

接上一篇AI开发&#xff1a;逻辑回归 - 实战演练- 垃圾邮件的识别&#xff08;一&#xff09; new_email 无论为什么文本&#xff0c;识别结果几乎都是垃圾邮件,因此我们需要对源码的逻辑进行梳理一下&#xff1a; 在代码中&#xff0c;new_email 无论赋值为何内容都被识别为…

Scratch游戏推荐 | 星际前线:帝国逆袭——揭开帝国野心,挑战星际极限!

今天推荐一款充满科幻与冒险元素的Scratch作品——《星际前线&#xff1a;帝国逆袭》&#xff01;由theChAOTiC制作&#xff0c;这款游戏让你踏入危险的星际前线&#xff0c;与暴虐的Terran帝国展开激烈对抗。在这里&#xff0c;你将探索未知的星域&#xff0c;击败强大的Boss&…

【语音识别】Zipformer

Zipformer 是kaldi 团队于2024研发的序列建模模型。相比较于 Conformer、Squeezeformer、E-Branchformer等主流 ASR 模型&#xff0c;Zipformer 具有效果更好、计算更快、更省内存等优点。并在 LibriSpeech、Aishell-1 和 WenetSpeech 等常用数据集上取得了当时最好的 ASR 结果…

《Vue零基础入门教程》第十五课:样式绑定

往期内容 《Vue零基础入门教程》第六课&#xff1a;基本选项 《Vue零基础入门教程》第八课&#xff1a;模板语法 《Vue零基础入门教程》第九课&#xff1a;插值语法细节 《Vue零基础入门教程》第十课&#xff1a;属性绑定指令 《Vue零基础入门教程》第十一课&#xff1a;事…

buuctf-[SUCTF 2019]EasySQL 1解题记录

把你的旗帜给我&#xff0c;我会告诉你这面旗帜是对的。 堆叠注入查询数据库 1; show databases; ​ 查询表名 1; show tables; 获取flag 1;set sql_modepipes_as_concat;select 1

Git的基本使用操作

文章目录 Git 全局配置基本操作Git 常用命令版本回退根据版本号回滚分支远端分支 &#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f916;Git专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2024年12月1日12点50分 Git 全局配置 虽然说是全局配置&am…

飞凌嵌入式受邀亮相OpenHarmony人才生态大会2024

2024年11月27日&#xff0c;OpenHarmony人才生态大会2024在武汉洲际酒店举行。在这场汇聚了行业精英、技术大咖及生态伙伴的年度盛会上&#xff0c;飞凌嵌入式作为OpenHarmony社区的重要成员受邀出席&#xff0c;并展示了其在OpenHarmony 4.1系统适配方面的最新成果。 在大会的…