集合框架----源码解读ArrayList篇

news2025/2/26 9:54:58

1.ArrayList<E>

ArrayList是继承AbstractList<E> List

接口的可调整数组实现。实现所有可选的列表操作,并允许所有元素,包括null。除了实现List接口之外,该类还提供了一些方法来操作内部用于存储列表的数组的大小。(这个类大致相当于Vector,只是它是非同步的。)
size、isEmpty、get、set、iterator和listIterator操作在恒定时间内运行。加法运算在平摊常数时间内运行,也就是说,加n个元素需要O(n)时间。所有其他操作都在线性时间内运行(粗略地说)。与LinkedList实现相比,常量系数较低。
每个ArrayList实例都有一个容量。容量是用于存储列表中元素的数组的大小。它总是至少与列表大小一样大。随着元素被添加到数组列表中,它的容量会自动增长。除了添加一个元素具有恒定的平摊时间成本之外,没有指定增长策略的细节。
应用程序可以在添加大量元素之前使用ensureCapacity操作增加ArrayList实例的容量。这可能会减少增量再分配的数量。
注意,这个实现不是同步的。如果多个线程并发访问一个ArrayList实例,并且至少有一个线程在结构上修改了该列表,那么它必须在外部同步。(结构修改是添加或删除一个或多个元素,或显式调整支持数组的大小的任何操作;仅仅设置元素的值并不是结构修改。)这通常是通过在自然封装列表的某些对象上同步来实现的。如果不存在这样的对象,则应该使用集合“包装”列表。synchronizedList方法。这最好在创建时完成,以防止意外的不同步访问列表:
列表列表=集合。synchronizedList(新ArrayList(…));
这个类的迭代器和listIterator方法返回的迭代器是快速失败的:如果在迭代器创建后的任何时候,以除了迭代器自己的remove或add方法以外的任何方式对列表进行了结构修改,迭代器将抛出ConcurrentModificationException异常。因此,在面对并发修改时,迭代器会快速而干净地失败,而不是在未来不确定的时间发生任意的、不确定的行为。
注意,迭代器的快速失败行为不能得到保证,因为一般来说,在存在不同步的并发修改时,不可能做出任何硬保证。快速失败迭代器尽可能地抛出ConcurrentModificationException。因此,编写一个依赖于此异常的程序是错误的:迭代器的快速失败行为应该只用于检测误。

 当我们new一个 ArrayList<E>,我们去看一下他的无参构造器

 再点击DEFAULTCAPACITY_EMPTY_ELEMENTDATA

我们发现这就是一个数组,由此可以得出  ArrayList<E>就是一个数组。

2.ArrayList的add方法

进入add方法,下面就是尺寸加1,不知道他为什么扩容,我们也不知道为什么扩容,我们再进入ensureCapacityInternal方法看一下 

 进入这个方法我们就是把这个集合的最小容量传进去了,我们进入calculateCapacity方法

当ArrayList是空的时候,就去判断如果最小容量,比默认容量10小,就返回10

我们拿到10去 ensureExplicitCapacity 方法 进入grow方法,这个方法也就是扩容方法

 老的容量是0,因为我们之前没有扩过容,就是0,

  新增的容量 等于 0+0>>1=0,0右移一位加0,新的容量就是0,右移一位,可以理解为除以2但是不能当做除以2

 如果新容量-最小容量<0 ,就把最小容量给新的容量大小。现在新的容量应该是10

如果 10-数组的最大尺寸>0  ,执行newCapacity = hugeCapacity(minCapacity); 

 利用Arrays.copyOf(elementData, newCapacity); 数组复制方法把新的容量复制给空数组

 把第一个元素放到0的位置

 总结:

ArrayList的add方法底层实现原理:

1.判断是否需要扩容

默认给我们数组初始化容量==10;

2.直接通过index赋值

3.ArrayList的扩容如果1.5倍(理论的)

4.扩容其实就是生成一个新的对象

15.>>1 不是等于7.5而是等于7 。在机器里面是没有0.5这个概念的

3.ArrayList的get方法

 检查边缘,也就是是否越界

如果下标大于尺寸就会报数组下标越界异常

 没有越界就把对应的坐标的数据返回回去

 总结:get方法

1.判断数组下标是否越界

2.根据下标获取数组内容

 4.ArrayList的remove方法

检查下标是有问题,

 记录ArrayList结构修改次数,默认是0

 获取该坐标的元素

 我们进入这个缩容方法

打开api文档搜索这个方法 ,如果你没有api文档 我的开源仓库有

note/java/jdk api 1.8_google.CHM · Royalreairman/learn-computer - Gitee.com

 

 缩容原理:从删除下标后一位开始复制给要删除哪一位,最后一位变成null

总结:

删除实际上就是删除对应的下标index,删除后,后面的自动补齐。

remove方法我们发现ArrayList一个缺点,只要扩容过,无论我们这么缩容,他能装的数据还是最大的扩容数据,也是官方简绍的结构修改是添加或删除一个或多个元素,或显式调整支持数组的大小的任何操作;仅仅设置元素的值并不是结构修改

5.数组的时间复杂度(查询)

O(1): 基于数组下标index查询只要一次

O(n): 从头查询到尾部的次数 根据元素来查询 效率低

6.ArrAyList总结

1.ArrayList底层基于数组实现,根据index下标查询效率非常高

2.增、删底层基于数组实现的扩容,缩容 效率也很低

3.修改是方法是如果是根据index下标来修改所以效率高

4.无法对结构进行修改

5.每次缩容扩容会生成新的对象

6.不是同步的。如果多个线程并发访问一个ArrayList实例,并且至少有一个线程在结构上修改了该列表,那么它必须在外部同步。

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

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

相关文章

准备蓝桥杯的宝贝们看过来,二分法一网打尽(基础篇)

今天给大家介绍一下简单的二分法&#xff08;刷题第一步&#xff01;&#xff09; 二分基础题链接 二分查找有个很明显的特点就是有序&#xff0c;这个特点同学如果在题中看到就要格外注意 一定要看完&#xff0c;基本的三种解法&#xff0c;后面还有真题链接哦&#xff01;…

异步请求-AJAX

什么是同步交互 首先用户向HTTP服务器提交一个处理请求。接着服务器端接收到请求后&#xff0c;按照预先编写好的程序中的业务逻辑进行处理&#xff0c;比如和数据库服务器进行数据信息交换。最后&#xff0c;服务器对请求进行响应&#xff0c;将结果返回给客户端&#xff0c;返…

TCP三次握手与四次挥手

TCP三次握手的建立与四次挥手的过程 TCP协议 TCP 用于处理实时通信TCP是基于端口&#xff0c;面向连接的传输层协议TCP的握手和挥手本质上都是四次&#xff0c;只不过握手合并成三次。因为主机之间要想通信需要先建立双向数据通道TCP的主要特点是传输稳定性高&#xff0c;但是…

[自建题库]c认证初级

UTF-8的编码实现方式有几种? UTF8-1 / UTF8-2 / UTF8-3 / UTF8-4 二进制数1111.1111转换成十进制数是多少&#xff1f; 如果二进制数字“1000111______”采取偶校验&#xff0c;那么下划线的校验位处应该填什么&#xff1f; 0 在MPEG-4中&#xff0c;第九部分定义了IP网络传…

JS高级-语言特性(持续更新一)

JS高级-语言特性 JS高级-语言特性 一、JS面向对象编程 1.1面向对象介绍 1.2面向对象编程 1.3创建对象 二、构造函数 2.1构造函数 2.2构造函数存在的问题 三、原型 3.1构造函数的prototype属性 3.2构造函数、实例、原型三者之间的关系 3.3原型对象的获取及修改 3.4原…

[附源码]Python计算机毕业设计高校电子作业提交与批改系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;我…

CTFHub | Refer注入

0x00 前言 CTFHub 专注网络安全、信息安全、白帽子技术的在线学习&#xff0c;实训平台。提供优质的赛事及学习服务&#xff0c;拥有完善的题目环境及配套 writeup &#xff0c;降低 CTF 学习入门门槛&#xff0c;快速帮助选手成长&#xff0c;跟随主流比赛潮流。 0x01 题目描述…

[C#] GDI+ 之鼠标交互:原理、示例、一步步深入、性能优化

一、前言 “GDI”与“鼠标交互”&#xff0c;乍一听好像不可能&#xff0c;也无从下手&#xff0c;但是实现原理比想象中要简单很多。 基于“GDI”的“交互”&#xff0c;应用场景也很多&#xff0c;比如&#xff1a;流程图、数据图表、思维导图等等。 本篇文章就通过多个示例…

美新科技IPO过会:9个月营收6亿 林东融三兄弟为实控人

雷递网 雷建平 11月26日美新科技股份有限公司&#xff08;简称&#xff1a;“美新科技”&#xff09;日前IPO过会&#xff0c;准备在深交所创业板上市。美新科技计划募资9.58亿元&#xff0c;其中&#xff0c;5.1亿元用于美新科技新型环保塑木型材产业化项目&#xff08;一期&a…

基于HTML+CSS+JavaScript制作学生网页——外卖服务平台10页带js 带购物车

⛵ 源码获取 文末联系 ✈ Web前端开发技术 描述 网页设计题材&#xff0c;DIVCSS 布局制作,HTMLCSS网页设计期末课程大作业 | HTML期末大学生网页设计作业 HTML&#xff1a;结构 CSS&#xff1a;样式 在操作方面上运用了html5和css3&#xff0c; 采用了divcss结构、表单、超链…

[附源码]SSM计算机毕业设计拾穗在线培训考试系统JAVA

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

JS逆向 Frida - 夜神模拟器安装配置 基本使用

JS逆向 Frida - 夜神模拟器安装配置 基本使用 文章目录JS逆向 Frida - 夜神模拟器安装配置 基本使用前言一、Frida简单介绍&#xff1f;1.Frida是什么2.Frida原理(建议了解一下&#xff0c;否则后续的安装会有些懵懂)二、Frida下载1.pip安装frida模块2.查看本地的frida版本&…

大数据项目之电商数仓DataX、DataX简介、DataX支持的数据源、DataX架构原理、DataX部署

文章目录1. DataX简介1.1 DataX概述1.2 DataX支持的数据源2. DataX架构原理2.1 DataX设计理念2.2 DataX框架设计2.3 DataX运行流程2.4 DataX调度决策思路2.5 DataX与Sqoop对比3. DataX部署3.1 下载DataX安装包并上传到hadoop102的/opt/software3.2 解压datax.tar.gz到/opt/modu…

一、微服务入门

文章目录一、微服务大概认识二、单体架构架构和分布式架构三、微服务架构特征四、微服务技术对比五、SpringCloud 与 SpringBoot版本兼容关系如下&#xff1a;一、微服务大概认识 二、单体架构架构和分布式架构 单体架构&#xff1a;将业务的所有功能集中在一个项目中开发&…

一文弄懂 Diffusion Model

什么是 Diffusion Model 一、前向 Diffusion 过程 Diffusion Model 首先定义了一个前向扩散过程&#xff0c;总共包含T个时间步&#xff0c;如下图所示&#xff1a; 最左边的蓝色圆圈 x0 表示真实自然图像&#xff0c;对应下方的狗子图片。 最右边的蓝色圆圈 xT 则表示纯高斯…

Tomcat安装及配置和常见的问题(2022最新详解、图文教程)

Tomcat的配置安装1. 关于WEB服务器软件2. 配置Tomcat的服务器第一步&#xff1a;配置Java的运行环境第二步&#xff1a;Tomcat的安装第三步&#xff1a;启动Tomcat3. 问题一&#xff1a;解决Tomcat服务器在DOS命令窗口中的乱码问题&#xff08;控制台乱码&#xff09;4. 测试To…

问题盘点|使用 Prometheus 监控 Kafka,我们该关注哪些指标

Kafka 作为当前广泛使用的中间件产品&#xff0c;承担了重要/核心业务数据流转&#xff0c;其稳定运行关乎整个业务系统可用性。本文旨在分享阿里云 Prometheus 在阿里云 Kafka 和自建 Kafka 的监控实践。01Kafka 简介Aliware01Kafka 是什么&#xff1f;Kafka 是分布式、高吞吐…

算法选修(J.琴和可莉)(为选修画上句号)

可莉又去池塘炸鱼啦&#xff01;琴团长决定亲自捉拿可莉将其关禁闭。琴团长不断地追&#xff0c;可莉不断地跑。 琴团长和可莉的行动路线可以看做是一个有n个节点的无根树&#xff0c;初始时琴团长在A点&#xff0c;可莉在B点&#xff0c;她们互相知道对方的位置。 琴团长想尽…

P8869 [传智杯 #5 初赛] A-莲子的软件工程学

import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc new Scanner(System.in);long a sc.nextLong();long b sc.nextLong();System.out.println(Math.abs(a)*(b>0?1:-1));}} 题目背景 在宇宙射线的轰击下&#xff0c;莲子…

Day13--搜索建议-自动获取焦点与防抖处理

1.定义如下的 UI 结构&#xff1a; 我的操作&#xff1a; 第一次尝试&#xff1a;【出现轮廓】 官方文档&#xff1a; 1》在search.vue中&#xff1a; 效果图&#xff1a;【还是和博主的搜索框有区别的】 第二次尝试&#xff1a;【加上圆角】 官方文档&#xff1a; 第三次尝试…