【List集合】List接口源码解读一(ArrayList)

目录

前言

1. List接口的基本信息

2. ArrayList

2.1.ArrayList 的基本信息

2.2. ArrayList 的构造方法

2.2.1 ArrayList 的构造方法一

2.2.2 ArrayList 的构造方法二

2.2.3 ArrayList 的构造方法三

 2.3 ArrayList 的扩容方式

总结


前言

        Java 语言由于其跨平台、社区良好等特性,在企业级应用、移动应用、互联网开发等领域广泛应用。今天,让我们来认识一下 java.util 包下的 ArrayList 集合框架


1. List接口的基本信息

根据源码所知:

代码文档的作者:乔什·布洛赫(Josh Bolch)和尼尔·盖夫特(Neal Gafter)

  • List 接口继承自Collection接口
  • List 的实现类:
  1. ArrayList
  2. LinkedList
  3. Vector
  • List 的抽象类:
  1. AbstractList
  2. AbstractSequentialList
  • 代码起始版本:Java 1.2

2. ArrayList

2.1.ArrayList 的基本信息

根据源码所知:

  •  ArrayList 继承自抽象类 AbstractList
  • ArrayList 实现的接口:
  1. List 接口:表示一个有序的集合
  2. RandomAccess:标记接口,用于标识支持高效随机访问的集合
  3. Cloneable:支持克隆(Clone)操作
  4. java.io.Serializable:可以将当前类的对象转换为字节序列,以便在网络传输和保存到文件

根据源码所知:

  • serialVersionUID :这是用于序列化和反序列化 ArrayList 对象时的版本号。当对 ArrayList 类进行修改时,需要更新该版本号,以确保序列化和反序列化的兼容性。
  • int DEFAULT_CAPACITY = 10:默认的初始容量值,表示当没有指定容量时,ArrayList 的初始容量为 10。
  • Object[ ] EMPTY_ELEMENTDATA = { }: 这是一个空的 Object 数组,用于表示空的 ArrayList 实例。
  • Object[ ] DEFAULTCAPACITY_ELEMENTDATA = { }: 这也是一个空的 Object 数组,与 EMPTY_ELEMENTDATA 不同之处在于,当第一个元素被添加时,如果 elementData 数组等于 DEFAULTCAPACITY_EMPTY_ELEMENTDATA,它将会被扩容为默认容量 DEFAULT_CAPACITY。
  • transient Object [ ] elementData:存储 ArrayList 元素的数组缓冲区。ArrayList 的容量等于这个数组缓冲区的长度。当 elementData 等于 DEFAULTCAPACITY_EMPTY_ELEMENTDATA 时,表示 ArrayList 是空的,并且当第一个元素被添加时,会将其扩容为默认容量。

2.2. ArrayList 的构造方法

2.2.1 ArrayList 的构造方法一

根据源码所知:

这个构造方法接受一个整型参数,其中 initialCapacity 表示初始化 ArrayList 的初始容量

  • 如果 initialCapacity 大于0,则初始化 elementData 数组为指定容量的 Object 数组。
  • 如果 initialCapacity 等于0,则将 elementData 数组初始化为空的常量EMPTY_ELEMENTDATA。
  • 如果 initialCapacity 小于0,则抛出 IllegalArgumentException 异常,提示传入的容量参数不合法。

2.2.2 ArrayList 的构造方法二

根据源码所知:

这是一个无参构造方法,用于构造一个空列表,初始容量为默认的大小。

  • 默认的空列表会将 elementData 数组初始化为DEFAULTCAPACITY_EMPTY_ELEMENTDATA。

2.2.3 ArrayList 的构造方法三

根据源码所知:

这个构造方法接受一个类型为Collection的参数c,用于构造一个包含指定集合元素的ArrayList。

  • 将集合c转换为数组,并赋值给 elementData。
  • 获取数组的长度作为列表的大小 size。
  • 如果数组的长度不为0,针对可能出现的类型转换问题进行处理,确保elementData是Object[] 类型。
  • 如果数组长度为0,将elementData初始化为空的常量EMPTY_ELEMENTDATA。

 2.3 ArrayList 的扩容方式

根据源码所知:

  • 当 ArrayList 需要进行扩容时,会调用 grow(int minCapacity)方法。这个方法会计算出新的容量值 newCapacity
  • 通常情况下,新容量值是旧容量的1.5倍(即 oldCapacity + (oldCapacity >> 1)
  • 接着会判断是否超出了最大数组容量(2^31 - 1 - 8),如果超出则调用 hugeCapacity 方法进行处理
  • 最后,通过调用 Arrays.copyOf 方法,将原数组的内容复制到新的具有更大容量的数组中,完成扩容操作

根据源码所知:

  • 当数组容量的新容量超出最大数组容量(2^31 - 1 - 8)时调用hugeCapacity 方法进行处理,如果需要的最小容量 minCapacity 小于 0,则会抛出 OutOfMemoryError 异常
  • 如果需要的最小容量 minCapacity 超出数组最大容量(2^31 - 1 - 8),则返回 2^31 - 1 给新容量,否则返回数组最大容量 2^31 - 1 -8 

总结

  • ArrayList 继承自 AbstractList 抽象类 

ArrayList 的应用场景:

  • ArrayList 的数据结构为 Object[ ] 数组,实现了 RandomAccess 接口,支持高效随机访问和克隆操作。适用于遍历、查找等读取数据元素的应用场景。
  • ArrayList 实现了 java.io.Serializable ,可以被序列化为字节序列,以便在网络传输和保存到文件

ArrayList 的扩容方式:

  1. 使用无参构造方法创建 ArrayList 时,实际上初始化赋值是一个空数组,当向数组中添加第一个元素时,数组容量扩容为10
  2. 当数组容量不足时,调用 grow() 方法进行扩容,每次扩容后容量会变为原来的 1.5 倍左右
  3. ArrayList 的最大容量为 2^31 - 1 或 2^31 -1 -8

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

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

相关文章

代码学习记录21--回溯算法第二天

随想录日记part21 t i m e : time: time: 2024.03.16 主要内容:今天主要是结合类型的题目加深对回溯算法的理解:1:组合总和;2:电话号码的字母组合 216.组合总和III17.电话号码的字母…

Docker----Dockerfile构建微服务镜像

目录 一、关键步骤 二、具体步骤 1、准备后端jar包(这里以java后端演示) 2、编写Dockerfile 3、构建镜像 4、运行镜像容器 5、测试是否成功 一、关键步骤 1、准备后端jar包(这里以java后端演示) 2、编写Dockerfile 3、构建镜像 4、运行镜像容器 5、测试是否成功 二…

阅读 - 二维码扫码登录原理

在日常生活中,二维码出现在很多场景,比如超市支付、系统登录、应用下载等等。了解二维码的原理,可以为技术人员在技术选型时提供新的思路。对于非技术人员呢,除了解惑,还可以引导他更好地辨别生活中遇到的各种二维码&a…

WebGIS之实现查询地区天气并让地区高亮

一.预览>> 二.思路>> 根据搜索框的内容来进行页面视角的切换,对应的地区高亮,右边有关天气的地方实时更新,并且因为代码体量非常小,并没有选择在框架下完成。直接一个html文件搞定了,但实际上还是有一些坑…

PMP的学习方法

PMBOK编撰了管理项目需要的49个过程(输入、工具技术、输出)。工具技术文件,林林总总百余个。第一部分,按照十大知识领域顺序从前到后编排;第二部分,按照五大过程组顺序重新编排了一遍。 一,PMB…

MySQL语法分类 DQL(2)条件查询

为了更好的学习这里给出基本表数据用于查询操作 create table student (id int, name varchar(20), age int, sex varchar(5),address varchar(100),math int,english int );insert into student (id,name,age,sex,address,math,english) values (1,马云,55,男,杭州,66,78),…

【开源】SpringBoot框架开发房屋出售出租系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 房屋销售模块2.2 房屋出租模块2.3 预定意向模块2.4 交易订单模块 三、系统展示四、核心代码4.1 查询房屋求租单4.2 查询卖家的房屋求购单4.3 出租意向预定4.4 出租单支付4.5 查询买家房屋销售交易单 五、免责说明 一、摘…

STM32定时器预分频系数和自动重装载系数

现以一个图开始: 预分频器和计数器最大值都为65535(从0开始) 预分配器:比如输入的是72MHZ的频率,(预分频系数为0)不分频的话就是一秒数72000000次,如果预分频系数为(72…

论文阅读——GeoChat(cvpr2024)

GeoChat : Grounded Large Vision-Language Model for Remote Sensing 一、引言 GeoChat,将多模态指令调整扩展到遥感领域以训练多任务会话助理。 遥感领域缺乏多模式指令调整对话数据集。受到最近指令调优工作的启发,GeoChat 使用 Vicuna-v1.5和自动化…

Java面向对象案例之描述专业和学生(4)

类的方法图 学生类: 属性:学号,姓名,年龄,所学习的专业方法:学习的方法,描述学习状态。描述内容包括姓名、学号、年龄、所学习的专业信息 专业类: 属性:专业编号&#xf…

Day66:WEB攻防-Java安全SPEL表达式SSTI模版注入XXEJDBCMyBatis注入

目录 JavaSec搭建 Hello-Java-Sec搭建 Java安全-SQL注入-JDBC&MyBatis Java安全-XXE注入-Reader&Builder Java安全-SSTI模版-Thymeleaf&URL Java安全-SPEL表达式-SpringBoot框架 知识点: 1、Java安全-SQL注入-JDBC&MyBatis 2、Java安全-XXE注…

RabbitMQ学习总结-基础篇

1..RabbitMQ 本身是一个消息中间件,在服务应用中,可解决高性能,高并发,高应用的问题,极大程度上解决了应用的性能问题。 2.MQ的使用分为生产者和消费者,生产者生产消息,消费者去消费消息。 3.…